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
SQL Server 2000 中没有内置的存储过程执行权限的数据库角色。但是,您引用的第一篇文章实际上包含了完全解决您的问题所需的一切。但是,我将尝试在逐步的过程中更清楚地说明它(您只需遵循一次即可创建角色,然后仅在创建新角色时重新运行最后一步程序)。在此过程中,我将为您要以这种方式配置的数据库使用名称 my_database:
创建存储过程sp_grantexecute(链接自第一篇文章):
创建一个名为 db_executor 的自定义角色(对要配置此角色的每个数据库重复此步骤)
使用您之前添加的 sp_grantexecute 过程将所有现有过程的执行权限授予新角色(每次创建新过程时只运行此步骤):
db_executor
现在,除了其他两个角色 (db_datareader
和) 之外,您只需将新角色 ( ) 分配给db_datawriter
应该具有您正在寻找的访问权限的用户。除了杰西卡的回答之外,您显然可以设置一个 SQL 代理作业来每分钟运行一次 sp_grantexec 或类似的东西。如果您使用的是 SQL Server 2005,那么每当创建存储过程/函数时,我已经成功地使用数据库级架构触发器向 db_executor 授予 EXEC 权限。
没有其他要求,通常您不需要担心主读/写,而是在 2000 上执行某些扩展存储过程(大多数系统表/视图受运行查询的用户角色限制(授权登录没有关联用户)。
http://vyaskn.tripod.com/sql_server_security_best_practices.htm是锁定 SQL 2000 实例的好资源。请记住始终首先在非生产机器上进行测试。
MBSA 有时也可以指出 SQL 中的基本问题。