Sql 自动修复用户的游标中的游标

Sql 自动修复用户的游标中的游标,sql,sql-server,tsql,cursors,Sql,Sql Server,Tsql,Cursors,我有下面的脚本,我希望能够运行一个动态的数据库列表,除了系统数据库。这就够直截了当的了。棘手的是,每个数据库都可能有不同的用户列表来运行fix命令。这是第三个光标吗?下面的尝试没有正确填充每个数据库的用户。任何帮助都将不胜感激 SET nocount ON GO SET QUOTED_IDENTIFIER OFF GO -- -- Declare and define variables -- DECLARE @databasename VARCHAR(50) -- database name

我有下面的脚本,我希望能够运行一个动态的数据库列表,除了系统数据库。这就够直截了当的了。棘手的是,每个数据库都可能有不同的用户列表来运行fix命令。这是第三个光标吗?下面的尝试没有正确填充每个数据库的用户。任何帮助都将不胜感激

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中
您的过程的主要问题是,与PHP不同,TSQL不能互换使用单引号和双引号。所以我修复了动态SQL字符串

另一件次要的事情似乎是来自游标声明的一个不连贯的查询——在您的声明中,在第二个声明后面有一个select子句,而没有伴随的from子句,如果找不到该游标,则会在名称上抛出from子句。所以我也把它修好了

DECLARE @databasename SYSNAME, @sqlcommand nvarchar(max)
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 + ''';'
        FROM   sys.database_principals
        WHERE  Type='S'
            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 

编辑:将表切换到数据库\u主体,而不是每个注释的sys.sysusers。

或者您可以不费力地完成此操作

DECLARE @Output NVARCHAR(MAX)
SET @Output = ''

SELECT @Output = @Output +
'--Fixing Logins For ' + name + CHAR(10) + 
'USE ' + name + CHAR(10) + 
'EXEC sp_change_users_login ''AUTO_FIX'','''+
(
    SELECT  b.name 
    FROM   sys.sysusers as b
    WHERE  issqluser = 1
    AND b.name NOT IN ( 'dbo', 'guest', 'INFORMATION_SCHEMA', 'sys' )
)
+''''+CHAR(10)+CHAR(10)

FROM  master.dbo.sysdatabases
WHERE  NAME NOT IN ( 'master', 'model', 'msdb', 'tempdb', 'DBATools' )
PRINT @Output

我认为您应该在问题中添加特定的数据库标签。我猜是SQLServer?谢谢。这是一个问题,根据我所尝试的。如果运行此选项,您会注意到每个数据库的用户帐户都与ssms中数据库下拉列表中当前选定的数据库一致。对于每个数据库,要修复的用户依次是不同的。脚本需要能够枚举每个数据库的用户,然后将他们插入到修复字符串中。你能试试这个,让我知道你的想法吗。再次感谢。啊,那么您需要的是sys.database_主体,而不是sys.sysusers。
DECLARE @Output NVARCHAR(MAX)
SET @Output = ''

SELECT @Output = @Output +
'--Fixing Logins For ' + name + CHAR(10) + 
'USE ' + name + CHAR(10) + 
'EXEC sp_change_users_login ''AUTO_FIX'','''+
(
    SELECT  b.name 
    FROM   sys.sysusers as b
    WHERE  issqluser = 1
    AND b.name NOT IN ( 'dbo', 'guest', 'INFORMATION_SCHEMA', 'sys' )
)
+''''+CHAR(10)+CHAR(10)

FROM  master.dbo.sysdatabases
WHERE  NAME NOT IN ( 'master', 'model', 'msdb', 'tempdb', 'DBATools' )
PRINT @Output