答案1
SQL Server 2000 中没有用于存储过程执行权限的内置数据库角色。但是,您引用的第一篇文章实际上包含了完全解决问题所需的一切。但是,我将尝试通过分步过程更清楚地说明这一点(您只需遵循一次即可创建角色,然后每次创建新过程时只需重新运行最后一步)。在此过程中,我将使用名称 my_database 来表示您想要以这种方式配置的数据库:
创建存储过程授予执行权限(链接自第一篇文章):
use master go create procedure sp_grantexec(@user sysname,@pattern sysname = NULL,@debug int = 0) as set nocount on declare @ret int declare @sql nvarchar(4000) declare @db sysname ; set @db = DB_NAME() declare @u sysname ; set @u = QUOTENAME(@user) set @sql ='select ''grant exec on '' + QUOTENAME(ROUTINE_SCHEMA) + ''.'' + QUOTENAME(ROUTINE_NAME) + '' TO ' + @u + ''' FROM INFORMATION_SCHEMA.ROUTINES ' + 'WHERE OBJECTPROPERTY(OBJECT_ID(ROUTINE_NAME),''IsMSShipped'') = 0' if @pattern is not null set @sql = @sql + N' AND ROUTINE_NAME LIKE ''' + @pattern + '''' if @debug = 1 print @sql else exec @ret = master.dbo.xp_execresultset @sql,@db If @ret <> 0 begin raiserror('Error executing command %s',16,1,@sql) return -1 end
创建一个名为 db_executor 的自定义角色(对要配置此角色的每个数据库重复此步骤)
USE my_database GO EXEC sp_add_role 'db_executor'
授予所有人执行权限现存的使用先前添加的 sp_grantexecute 过程将过程添加到新角色(每次创建新过程时只需运行此步骤):
USE my_database GO EXEC master.dbo.sp_grantexecute 'db_executor'
db_executor
现在,除了另外两个角色(db_datareader
和)之外,您还可以简单地将新角色()分配db_datawriter
给应该具有您所需访问权限的用户。
答案2
除了杰西卡的回答之外,您显然可以设置 SQL Agent 作业以每分钟运行 sp_grantexec 或类似操作。如果您使用的是 SQL Server 2005,我已成功使用数据库级架构触发器在创建存储过程/函数时向 db_executor 授予 EXEC 权限。
如果没有其他要求,通常您不需要担心主读/写,而是在 2000 上执行某些扩展存储过程(大多数系统表/视图受运行查询的用户角色限制(授予的登录没有关联用户)。
http://vyaskn.tripod.com/sql_server_security_best_practices.htm是锁定 SQL 2000 实例的良好资源。请记住始终先在非生产机器上进行测试。
MBSA 有时也可以指出 SQL 中的基本问题。