我正在寻找最佳方式(最佳实践)和/或最少的管理工作,以允许用户只读(仅限SELECT)访问数据库和使用任何标量UDF在数据库中定义。我可以通过仅将db_datareader角色分配给用户Login来完成任务的第一部分。但是,用户无法在此数据库(SQL Server 2008 R2)中查看或执行任何标量UDF。我知道你可以在My_UDF上运行GRANT EXECUTE到MY_USER,它会工作,它将允许用户访问。但是,这有两个问题。首先,我们有数百个UDF,我们需要遍历所有这些UDF,为每个UDF提供用户EXECUTE。其次,每当创建新的UDF时,我们都需要再次向此READ-ONLY用户发出此命令。
目标是尽可能少地授予用户权限,但仍允许他们执行SELECT(无UPDATE,INSERT或DELETE)并且能够在SELECTS中使用任何UDF。
答案 0 :(得分:0)
如果您使用的是SQL Server 2005及更高版本,则可以尝试GRANT EXECUTE TO [MyDomain\MyUser]
这将为数据库级别的用户提供Execute
权限,包括任何存储过程。
答案 1 :(得分:0)
除了将它们放在自己的架构中(根据你上面说的,似乎不可行),我认为你仍然坚持在对象层面授予权限。幸运的是,使用一些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')
}