【问题标题】:SELECT only access to SQL Server with access execute any Scalar UDFSELECT 仅访问 SQL Server 并访问执行任何标量 UDF
【发布时间】: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 语句并运行它。

标签: sql-server permissions


【解决方案1】:

如果你使用的是SQL Server 2005及以上版本,可以试试GRANT EXECUTE TO [MyDomain\MyUser]

这将在数据库级别向用户授予Execute 权限,包括任何存储过程。

【讨论】:

  • 对于这种情况来说太宽泛了。这将为用户提供比预期更多的访问权限。
  • 我同意肖恩的观点。超出需要的权限。
【解决方案2】:

除了将它们放在自己的架构中(从您上面所说的情况来看,这似乎不可行),我认为您仍然坚持在对象级别授予权限。幸运的是,这对于一些 powershell 和肘部油脂来说并不太难。

import-module sqlps;

$perms = new-object Microsoft.SqlServer.Management.Smo.ObjectPermissionSet;
$perms.Execute = $true;

$srv = new-object microsoft.sqlserver.management.smo.server 'yourServer'
$db = $srv.databases['yourDb'];
foreach ($f in $db.UserDefinedFunctions) {
    $f.grant($perms, 'some grantee')
}

【讨论】:

    猜你喜欢
    • 2018-12-28
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多