Sql server 选择仅访问SQL Server,并使用access执行任何标量UDF

Sql server 选择仅访问SQL Server,并使用access执行任何标量UDF,sql-server,permissions,Sql Server,Permissions,我正在寻找最佳方法最佳实践和/或最少的管理工作,以允许用户对数据库进行只读选择访问,并使用数据库中定义的任何标量UDF。我可以通过只为用户登录分配db_datareader角色来完成任务的第一部分。但是,用户无法查看或执行此数据库SQL Server 2008 R2中的任何标量UDF。我知道你可以对我的用户运行GRANT EXECUTE ON My_UDF,它可以工作,并且允许用户访问。然而,这有两个问题。首先,我们有数百个UDF,我们需要遍历所有UDF,让用户执行每个UDF。其次,无论何时创建

我正在寻找最佳方法最佳实践和/或最少的管理工作,以允许用户对数据库进行只读选择访问,并使用数据库中定义的任何标量UDF。我可以通过只为用户登录分配db_datareader角色来完成任务的第一部分。但是,用户无法查看或执行此数据库SQL Server 2008 R2中的任何标量UDF。我知道你可以对我的用户运行GRANT EXECUTE ON My_UDF,它可以工作,并且允许用户访问。然而,这有两个问题。首先,我们有数百个UDF,我们需要遍历所有UDF,让用户执行每个UDF。其次,无论何时创建新的UDF,我们都需要再次向该只读用户发出此命令


目标是尽可能少地授予用户权限,但仍允许他们执行SELECT的不更新、插入或删除操作,并能够在其SELECT中使用任何自定义项。

如果您使用的是SQL Server 2005及更高版本,您可以尝试将EXECUTE授予[MyDomain\MyUser]


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

除了将它们放在他们自己的模式中之外(从上面的说法来看,这似乎不可行),我认为您必须在对象级别授予权限。幸运的是,使用一些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')
}

我建议您有第三个问题,这是一个更大的问题,您有数百个标量UDF。标量UDF的性能是出了名的糟糕。您应该考虑将尽可能多的这些函数转换为内联表值函数。不要将其与实际上比标量函数更糟糕的多语句表函数混淆。如果你死心塌地坚持这些UDF,也许你可以为它们创建一个模式。我同意这是一个问题,但我对此无能为力。这些都是由我们的ERP系统产生的,我们处于高等教育阶段,用户已经开始依赖这些系统。由于ERP创建并使用了它们,我会犹豫是否将它们转移到另一个模式中。然后,您所能做的就是使用sql为您生成权限。只需查询sys.objects并构建sql语句。然后,您可以通过复制和粘贴来选择性地删除行,或者创建一个大的动态sql语句并运行它。这对于这种情况来说太广泛了。这将给用户提供比预期更多的访问权限。我同意肖恩的观点。比需要更多的权威。