0

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

移动数据库登录的 8 个步骤

我想在一个输出中生成数据库级别安全性、角色和显式权限语句,这样我就不会一遍又一遍地复制和粘贴,以便它们为服务器上的所有数据库运行(当然要减去 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

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

4

3 回答 3

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
于 2012-12-16T21:15:50.240 回答
0

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

于 2012-12-16T21:11:49.990 回答
0

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

于 2012-12-17T00:17:44.800 回答