use*_*146 1 permissions sql-server
我刚刚将 SQL Server 2000 DB 转移到 SQL Server 2005 Express(即将升级),在此过程中,我正在清除前任所有者的一些坏习惯。
一方面,旧的 Web 应用程序使用“sa”帐户访问数据库。我现在已经创建了一个新的登录名并将其映射到这个特定数据库中的用户,并具有 db_datawriter 和 db_datareader 角色。登录工作正常...但是当应用程序尝试执行任何存储的 proc 时,我收到有关未找到该 proc 的错误。这是一个权限问题...使用新凭据通过 Management Studio 连接到服务器向我表明,该应用程序的存储过程甚至都不可见,因此该错误是有道理的。
但是……这里有两三百个存储过程。如何授予此用户访问权限以执行任何存储的过程,而无需修改每个过程的权限?现在我去为这个用户添加了“db_owner”角色。但这似乎有点矫枉过正……?
是的,这太过分了。最简单的方法是授予用户执行模式中所有过程的权限(或者更好地授予角色此权限)。
首先创建一个新角色。将其称为 YourAppRole(或其他名称,名称并不重要)。使您的用户帐户成为该角色的成员。授予角色对 dbo 模式(或过程所在的任何模式)的执行权限。这可以在 UI 中完成,也可以通过代码完成。
GRANT EXEC ON SCHEMA::dbo TO YourAppRole
Run Code Online (Sandbox Code Playgroud)
或者,您可以编写一个 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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7226 次 |
最近记录: |