为SQL Server用户授予存储过程执行权限的正确方法是什么?

我刚把一个SQL Server 2000数据库移到了SQL Server 2005 Express(它将很快升级),在这个过程中,我清理了以前所有者的一些不良习惯。

首先,旧的Web应用程序使用“sa”帐户访问数据库。 我现在已经创build了一个新的Login,并使用db_datawriter和db_datareaderangular色将它映射到这个特定数据库中的一个用户。 login工作正常…但是当应用程序试图执行任何存储过程,我得到一个有关过程中找不到错误。 这是一个权限问题…通过使用新的凭据通过Management Studio连接到服务器显示,该应用程序的存储过程都不可见,所以错误是有道理的。

但是…这里有两三百个存储过程。 我如何授予这个用户访问权限来执行任何存储过程,而无需修改每个权限? 现在我去了,为这个用户添加了“db_owner”angular色。 但是这似乎是矫枉过正…?

是的,这太过分了。 最简单的方法是授予用户执行架构中所有过程的权限(或者更好地授予angular色这个权限)。

首先创build一个新的angular色。 把它叫做YourAppRole(或者其他的,名字并不重要)。 让您的用户帐户成为angular色的成员。 授予angular色对dbo模式的执行权(或者程序所在的任何模式)。 这可以在UI中完成,也可以通过代码完成。

GRANT EXEC ON SCHEMA::dbo TO YourAppRole 

或者你可以编写一个T / SQL脚本去完成所有的程序,然后授予权利。 从技术上讲,这是一个更安全的select。

 DECLARE @proc sysname DECLARE @cmd varchar(8000) DECLARE cur CURSOR FOR select '[' + schema_name(schema_id) + '].[' + name + ']' from sys.procedures OPEN cur FETCH next from cur into @proc WHILE @@FETCH_STATUS = 0 BEGIN SET @cmd = 'GRANT EXEC ON ' + @proc + ' TO YourAppRole' EXEC (@cmd) FETCH next from cur into @proc END CLOSE cur DEALLOCATE cur 

如果它们全都在相同的模式中,则可以授予其中的执行权。

就像是…

授予用户在schema :: dbo上执行的权限

然后摆脱你添加的其他angular色,testing,看看它是否需要基表的权限