使用sp_MSforeachdb通过数据库“循环”并返回1个数据集

时间:2012-12-16 20:49:39

标签: sql-server-2008 tsql sql-server-2012 sp-msforeachdb

所以,我一直在努力解决我在好友网站上找到的代码:

8 Steps to Moving Database Logins

我想在一个输出中生成数据库级安全性,角色和显式权限语句,所以我不是一遍又一遍地复制和粘贴,以便它们为服务器上的所有数据库运行(当然减去tempdb) 。

Declare @FullStatement varchar(MAX)
Set @FullStatement = ' use [?]; SELECT  dp.state_desc + N'' '' + dp.permission_name + N'' TO '' + cast(QUOTENAME(dpl.name COLLATE DATABASE_DEFAULT) as nvarchar(500))  AS TSQLScript
FROM sys.database_permissions AS dp
INNER JOIN sys.database_principals AS dpl ON (dp.grantee_principal_id = dpl.principal_id)
WHERE dp.major_id = 0
and dpl.name not like ''##%'' -- excluds PBM accounts
and dpl.name not in (''dbo'', ''sa'', ''public'')
ORDER BY dp.permission_name ASC, dp.state_desc ASC'

Exec sp_MSforeachdb  @FullStatement

如何使用表变量,临时表等修改我拥有的,按原样工作但不方便的内容,以便所有语句都在一个数据集中?

3 个答案:

答案 0 :(得分:4)

大卫,

这是你想要的吗?

CREATE TABLE tempdb.dbo.Results (c1 VARCHAR(8000))

Declare @FullStatement varchar(MAX)
Set @FullStatement = 'SELECT ''use [?]''; SELECT  dp.state_desc + N'' '' + dp.permission_name + N'' TO '' + cast(QUOTENAME(dpl.name COLLATE DATABASE_DEFAULT) as nvarchar(500))  AS TSQLScript
FROM [?].sys.database_permissions AS dp
INNER JOIN [?].sys.database_principals AS dpl ON (dp.grantee_principal_id = dpl.principal_id)
WHERE dp.major_id = 0
and dpl.name not like ''##%'' -- excluds PBM accounts
and dpl.name not in (''dbo'', ''sa'', ''public'')
ORDER BY dp.permission_name ASC, dp.state_desc ASC'

INSERT INTO tempdb.dbo.Results Exec sp_MSforeachdb  @FullStatement

select * FROM tempdb.dbo.Results

答案 1 :(得分:0)

有多种方法可以完成这项工作。您可以使用powershell循环遍历所有数据库并将结果放在excel中。纳尔逊先生在他的powershell sql大学系列中有这个。对不起,会为你拉链接,但我正在机场的手机上打字。

答案 2 :(得分:0)

为什么要编写数据库用户和权限的脚本?它们位于数据库中,在迁移数据库时仍然存在。除非您从头开始重新创建数据库,否则不需要这样做。