【发布时间】:2014-09-18 15:47:55
【问题描述】:
我正在寻找最佳方式(最佳实践)和/或最少的管理工作,以允许用户只读(仅限 SELECT)访问数据库和使用定义在数据库。我可以通过仅将 db_datareader 角色分配给用户登录来完成任务的第一部分。但是,用户无法查看或执行此数据库 (SQL Server 2008 R2) 中的任何标量 UDF。我知道您可以在 My_UDF TO MY_USER 上运行 GRANT EXECUTE,它会起作用并且允许用户访问。但是,这样做有两个问题。首先,我们有数百个 UDF,我们需要遍历所有这些 UDF,将用户 EXECUTE 提供给每个 UDF。其次,无论何时创建新的 UDF,我们都需要再次向该只读用户发出此命令。
目标是为用户提供尽可能少的权限,但仍允许他们执行 SELECT(无 UPDATE、INSERT 或 DELETE)并能够在其 SELECTS 中使用任何 UDF。
【问题讨论】:
-
我建议你有第三个问题,这是一个更大的问题,你有数百个标量 UDF。标量 UDF 的性能是出了名的糟糕。您应该考虑将尽可能多的这些转换为内联表值函数。不要将其与实际上比标量函数更差的多语句表函数混淆。如果您执着于坚持使用这些 udf,也许您可以为它们创建一个模式。这将使访问更容易处理。
-
我同意这是一个问题,但我无能为力。这些是由我们的 ERP 系统生成的(我们在高等教育中),用户已经变得依赖它们。由于 ERP 创建和使用它们,我会犹豫将它们移到另一个模式中。
-
呃。然后,您所能做的就是使用 sql 为您生成权限。只需查询 sys.objects 并构建 sql 语句。然后,您可以复制和粘贴(选择性地删除行)或创建一个大的动态 sql 语句并运行它。