使用sp_MSforeachdb对所有数据库执行sp_helprotect

时间:2013-07-04 22:35:27

标签: sql sql-server sql-server-2005 sp-msforeachdb

任何人都可以使用sp_MSforeachdb转换以下SQL查询? 我正在使用SQL Server 2005 SP4。谢谢!

DECLARE @tmpResults TABLE
(Owner sysname, Object sysname, Grantee sysname, Grantor sysname,  ProtectType nvarchar(10), Action nvarchar(60), Column1 sysname)

DECLARE @DB_Grant TABLE
(DBName sysname, Owner sysname, Object sysname, Grantee sysname, Grantor sysname,  ProtectType nvarchar(10), Action nvarchar(60), Column1 sysname)

USE master
INSERT INTO @tmpResults EXEC sp_helprotect;
INSERT INTO @DB_Grant SELECT DB_Name(), t.* FROM @tmpResults t
DELETE @tmpResults

USE model
INSERT INTO @tmpResults EXEC sp_helprotect;
INSERT INTO @DB_Grant SELECT DB_Name(), t.* FROM @tmpResults t
DELETE @tmpResults

-- Repeat for all remaining DB

SELECT * FROM @DB_Grant
ORDER BY DBName, Grantee, Action

1 个答案:

答案 0 :(得分:1)

这应该这样做:

IF OBJECT_ID('tempdb..#dbGrant') IS NOT NULL
    DROP TABLE #dbGrant
IF OBJECT_ID('tempdb..#tempResults') IS NOT NULL
    DROP TABLE #tempResults

CREATE TABLE #dbGrant
(
[DBName] sysname, 
[Owner] sysname, 
[Object] sysname, 
[Grantee] sysname, 
[Grantor] sysname,  
[ProtectType] nvarchar(10), 
[Action] nvarchar(60), 
[Column] sysname
)

CREATE TABLE #tempResults
(
[Owner] sysname, 
[Object] sysname, 
[Grantee] sysname, 
[Grantor] sysname,  
[ProtectType] nvarchar(10), 
[Action] nvarchar(60), 
[Column1] sysname
)

EXEC sp_MSforeachdb 'IF ''?''  NOT IN (''tempDB'')
BEGIN
        INSERT INTO #tempResults EXEC sp_helprotect;
        INSERT INTO #dbGrant SELECT ''?'',t.* FROM #tempResults t
        TRUNCATE TABLE #tempResults
END'

SELECT * FROM #dbGrant
ORDER BY DBName, Grantee, Action

DROP TABLE #dbGrant,#tempResults