所以,我一直在努力解决我在好友网站上找到的代码:
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
如何使用表变量,临时表等修改我拥有的,按原样工作但不方便的内容,以便所有语句都在一个数据集中?
答案 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)
为什么要编写数据库用户和权限的脚本?它们位于数据库中,在迁移数据库时仍然存在。除非您从头开始重新创建数据库,否则不需要这样做。