【问题标题】:How to assign permissions for a database or a column in SQL Server?如何为 SQL Server 中的数据库或列分配权限?
【发布时间】:2014-09-30 23:46:36
【问题描述】:

我并不是真正的数据库专家。我必须为使用 ASP.NET MVC 5 创建的应用程序使用 localdb。现在,我知道可以通过更改连接字符串轻松更改数据库的类型。

我想做的是让我能够选择可以从数据库中读取的用户(最好基于他们的 Windows 凭据)。

我正在使用 localdb v11.0。我的架构如下所示:

文件表:

  • Id [int]
  • 内容 [varbinary(max)]
  • 电子邮件 [nvarchar]
  • 访问 [nvarchar(10)]

我该怎么做?通常,用户会直接尝试从content 列获取文件内容。

另外,有没有更好的方法将文件存储在数据库中?

【问题讨论】:

    标签: sql-server asp.net-mvc database database-permissions


    【解决方案1】:

    如果您想限制列,您有一个很好的创建视图的用例。授予对视图的选择权限,而不授予对基础表的权限。

    关于在服务器中存储文件,微软有一篇名为To BLOB or Not To BLOB 的论文。

    这是他们的结论:

    -如果您的图片或文档的大小通常低于 256K,则将它们存储在数据库的 VARBINARY 列中会更有效

    -如果您的图片或文档的大小通常超过 1 MB,则使用可以维护的 FILESTREAM 属性将它们存储在文件系统中会更有效

    -在这两者之间,可能是一个折腾

    如果您将二进制文件存储在数据库中,如果您不是在每次调用时都访问它,请考虑将文件移动到它自己的表中。如果您使用的是视图,则可以从两个表中获取列。

    如果您使用文件组,请查看 files and filegroup architecture

    【讨论】:

    • 不错不错。我的文件很小。所以我在做正确的事。但我想直接从数据库中获取文件,而不需要通过视图或网站或任何东西。有没有办法做到这一点?
    • @ritratt:不是这样。二进制文件的问题是它们需要上下文才能使用。例如,从 SQL Server 的角度来看,用 PNG 填充的 VARBINARY 或 FILESTREAM 列与用 JPG 填充的列相同。你需要知道它实际上是一个 PNG 的上下文,以便提取一个 PNG。 SQL Server 并不关心这一点。
    • 你说得对,这是有道理的。所以我想用一个单独的视图创建一个管理控件是最好的方法。
    【解决方案2】:

    最好在应用程序级别处理此问题,而不是尝试将用户的凭据传递到数据库以与数据库级别的访问控制保持一致。

    基本上,您需要做的就是为您的应用程序启用 Windows 身份验证。然后,如果您的用户在域上登录,他们将自动登录到您的应用程序,或者在访问该站点之前将被要求登录。然后,您可以通过 User.Identity.Name 在提供这些文件的操作上检索他们的用户名,并使用它仅从允许访问的文件中进行选择。

    一个复杂的问题是您在表中依赖Email。 Windows 身份验证的User.Identity.Name 的值将采用Domain\User 的形式。如果您域中的所有用户都有一个可预测的电子邮件地址 (user@domain.com),那么您可以使用此值来构造电子邮件地址。否则,您需要深入研究 AD 以获取用户的电子邮件地址。

    【讨论】:

    • 文件由匿名方用户上传到我的网站。只有我应该能够直接从我组织的数据库中下载它们。所以你的解决方案是有道理的。如果我不能这样做,也许我会尝试。谢谢!
    猜你喜欢
    • 2016-06-25
    • 2010-09-17
    • 2018-08-29
    • 2013-09-14
    • 2014-06-23
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 2019-04-30
    相关资源
    最近更新 更多