我刚刚将 SQL Server 2000 DB 移至 SQL Server 2005 Express(将很快升级),在此过程中,我正在清除以前所有者的一些坏习惯。
首先,旧的 Web 应用程序使用“sa”帐户访问数据库。我现在创建了一个新的登录名,并将其映射到此特定数据库中具有 db_datawriter 和 db_datareader 角色的用户。登录名工作正常……但是当应用程序尝试执行任何存储过程时,我收到有关未找到该过程的错误。这是一个权限问题……使用新凭据通过 Management Studio 连接到服务器时,我发现应用程序的所有存储过程都不可见,因此错误是有道理的。
但是……这里有两三百个存储过程。我如何授予此用户执行任何存储过程的权限,而不必修改每个存储过程的权限?现在我为该用户添加了“db_owner”角色。但这似乎有点过头了……?
答案1
是的,这有点过头了。最简单的方法是授予用户执行架构中所有程序的权限(或者更好的是授予角色此权限)。
首先创建一个新角色。将其命名为 YourAppRole(或任何其他名称,名称其实并不重要)。让您的用户帐户成为该角色的成员。授予该角色对 dbo 架构(或过程所在的任何架构)的执行权限。这可以在 UI 中完成,也可以通过代码完成。
GRANT EXEC ON SCHEMA::dbo TO YourAppRole
或者您可以编写一个 T/SQL 脚本来执行所有程序并授予权限。从技术上讲,这是一个更安全的选择。
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
答案2
如果它们都在同一个模式中,您可以授予其中的执行权限。
就像是...
授予用户在架构:: dbo 上执行权限
然后删除您添加的其他角色,进行测试,看看它是否需要基表的权限