我有以下脚本,我希望能够针对除系统数据库之外的数据库的动态列表运行它。这已经够直截了当了。棘手的一点是每个数据库可能有不同的用户列表来运行修复命令。这会是第三个光标吗?我在下面的尝试没有正确填充每个数据库的用户。任何帮助将不胜感激。
SET nocount ON
GO
SET QUOTED_IDENTIFIER OFF
GO
--
-- Declare and define variables
--
DECLARE @databasename VARCHAR(50) -- database name
DECLARE @sqlcommand nvarchar(256) -- SQL Command generated
-- 在@name 中包含范围内的数据库名称
DECLARE db_cursor CURSOR FOR
SELECT NAME
FROM master.dbo.sysdatabases
WHERE NAME NOT IN ( 'master', 'model', 'msdb', 'tempdb', 'DBATools' ) -- don't include the databases
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @databasename
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Fixing Logins for '
+ Cast(@databasename AS VARCHAR)
DECLARE curSQL CURSOR FOR
SELECT "USE " + ( @databasename ) + ";" + " exec sp_change_users_login 'AUTO_FIX','" + NAME + "'"
SELECT NAME
FROM sys.sysusers
WHERE issqluser = 1
AND NAME NOT IN ( 'dbo', 'guest', 'INFORMATION_SCHEMA', 'sys' )
OPEN curSQL
FETCH curSQL INTO @sqlcommand
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @sqlcommand
EXEC (@sqlcommand)
FETCH curSQL INTO @sqlcommand
END
CLOSE curSQL
DEALLOCATE curSQL
FETCH NEXT FROM db_cursor INTO @databasename
END
CLOSE db_cursor
DEALLOCATE db_cursor