【发布时间】:2010-10-05 04:31:11
【问题描述】:
我只允许通过一系列 Sproc 与 DB 交互来保护 DB;很普通的票价。
我已经挖掘并修改了一个脚本,该脚本循环并为所有非系统 SProcs 分配用户 EXECUTE 权限。它是一种享受,除了我希望将它添加到主数据库中,以便我可以轻松地将它用于任何后续项目。是的,我可以将 simple 保存为 .sql 文件,但我更喜欢这种方式。
问题是我不知道如何动态引用另一个数据库中的对象。例如,我可以在 MyDB.dbo.INFORMATION_SCHEMA.ROUTINES 上轻松查询,但如果 DB 名称是动态的(例如 @MyDBName),如何查询此 DB 中的对象?
编辑:感谢下面的海报,我现在有了一个可行的解决方案:
USE [master]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[spGrantExec]
@User sysname,
@DB varchar(50),
@Target varchar(50)
AS
/*---------------------------- SQL 2005 + -------------------------------*/
SET NOCOUNT ON
-- 1 - Variable declarations
DECLARE @SQL varchar(8000)
-- 2 - Create temporary table
Set @SQL =
'USE @DB
DECLARE @MAXOID int
DECLARE @OwnerName varchar(128)
DECLARE @ObjectName varchar(128)
DECLARE @CMD1 varchar(8000)
CREATE TABLE #StoredProcedures
(OID int IDENTITY (1,1),
StoredProcOwner varchar(128) NOT NULL,
StoredProcName varchar(128) NOT NULL)
-- 3 - Populate temporary table
INSERT INTO #StoredProcedures (StoredProcOwner, StoredProcName)
SELECT ROUTINE_SCHEMA, ROUTINE_NAME
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_NAME LIKE ''' + @Target + '%''
AND ROUTINE_TYPE = ''PROCEDURE''
-- 4 - Capture the @MAXOID value
SELECT @MAXOID = MAX(OID) FROM #StoredProcedures
-- 5 - WHILE loop
WHILE @MAXOID > 0
BEGIN
-- 6 - Initialize the variables
SELECT @OwnerName = StoredProcOwner,
@ObjectName = StoredProcName
FROM #StoredProcedures
WHERE OID = @MAXOID
-- 7 - Build the string
SELECT @CMD1 = ''GRANT EXEC ON '' + ''['' + @OwnerName + '']'' + ''.'' + ''['' + @ObjectName + '']'' + '' TO @user''
-- 8 - Execute the string
Print @CMD1
EXEC(@CMD1)
-- 9 - Decrement @MAXOID
SET @MAXOID = @MAXOID - 1
END
-- 10 - Drop the temporary table
DROP TABLE #StoredProcedures'
Set @SQL = REPLACE(REPLACE(REPLACE(@SQL, '@DB', @DB), '@User', @User), '@Target', @Target)
--Select @SQL
--Print @SQL
Exec (@SQL)
SET NOCOUNT OFF
【问题讨论】:
-
你可能想看看我找到的更干净的:SELECT @sp_executesql = quotename(@dbname) + '..sp_executesql' EXEC @sp_executesql @CMD1
标签: sql-server sql-server-2005 tsql permissions