Sql server 2008 &引用;循环;使用sp_MSforeachdb通过数据库并返回1个数据集

Sql server 2008 &引用;循环;使用sp_MSforeachdb通过数据库并返回1个数据集,sql-server-2008,tsql,sql-server-2012,sp-msforeachdb,Sql Server 2008,Tsql,Sql Server 2012,Sp Msforeachdb,所以,我一直在努力破解我在好友网站上找到的代码: 我希望在一个输出中生成数据库级别的安全性、角色和显式权限语句,这样我就不会一次又一次地复制和粘贴,这样它们就可以在服务器上的所有数据库上运行(当然不包括tempdb) 如何使用表变量、Temp Table等修改现有语句,使所有语句都位于一个数据集中,这些语句按原样工作,但不方便 有多种方法可以做到这一点。您可以使用powershell在所有数据库中循环并将结果放入excel。Nelson先生在他的powershell sql大学系列中有这一点。

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

我希望在一个输出中生成数据库级别的安全性、角色和显式权限语句,这样我就不会一次又一次地复制和粘贴,这样它们就可以在服务器上的所有数据库上运行(当然不包括tempdb)


如何使用表变量、Temp Table等修改现有语句,使所有语句都位于一个数据集中,这些语句按原样工作,但不方便

有多种方法可以做到这一点。您可以使用powershell在所有数据库中循环并将结果放入excel。Nelson先生在他的powershell sql大学系列中有这一点。很抱歉,我会帮你拉链接,但我正在机场用手机打字。

有多种方法可以完成此操作。您可以使用powershell在所有数据库中循环并将结果放入excel。Nelson先生在他的powershell sql大学系列中有这一点。对不起,我可以帮你拉链接,但我正在机场打电话。

大卫

这是你想要的吗

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
大卫

这是你想要的吗

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

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

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

啊,我不想使用Powershell。难道没有办法将生成的语句加载到表变量或临时表中吗?呃,我不想使用Powershell。是否有某种方法可以将生成的语句加载到表变量或临时表中?这很有效。我将尝试添加其他两个数据库类别。我不敢相信事情竟那么简单。我尝试了一些类似的方法,但总是出错。酷。我的错,我以为你需要把烫发放回数据库。这就是我添加use语句的原因,删除SELECT“use[?]”;从@FullStatement初始化开始。抱歉,很正常,当我意识到这一点时,我删除并重新输入了我的评论。是的,你说得对。我把Use语句放在一边。还有一件事,我如何免除像TempDB这样的数据库?我建议看看Aaron Bertrand的sp_foreachdb,它更可靠、更灵活。这很有效。我将尝试添加其他两个数据库类别。我不敢相信事情竟那么简单。我尝试了一些类似的方法,但总是出错。酷。我的错,我以为你需要把烫发放回数据库。这就是我添加use语句的原因,删除SELECT“use[?]”;从@FullStatement初始化开始。抱歉,很正常,当我意识到这一点时,我删除并重新输入了我的评论。是的,你说得对。我把Use语句放在一边。还有一件事,我如何免除像TempDB这样的数据库?我建议看看Aaron Bertrand的sp_foreachdb,它更可靠、更灵活。