以下のスクリプトがあり、システム データベースを除くデータベースの動的リストに対してこれを実行できるようにしたいと考えています。それは簡単です。注意が必要なのは、修正コマンドを実行する対象となるユーザーのリストがデータベースごとに異なる可能性があることです。これは 3 番目のカーソルでしょうか? 以下の私の試みは、各データベースのユーザーを適切に入力していません。どんな助けでも大歓迎です。
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