繁体   English   中英

更改 MS SQL Server 2008 R2 中所有数据库的所有用户

[英]Altering all the users of all the databases in MS SQL Server 2008 R2

我目前正在尝试对 SQL 服务器的所有数据库的所有用户应用ALTER命令。 我的方法是使用游标,一个循环遍历每个数据库,另一个循环遍历每个数据库的所有用户。

我使用了以下代码结构

DECLARE @db VARCHAR(256) -- DB name
DECLARE @user VARCHAR(256) -- Username

-- Selecting all the databases
DECLARE db_cursor CURSOR FOR
SELECT name FROM sys.databases WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb')


OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @db

WHILE @@FETCH_STATUS = 0
BEGIN

    PRINT ' -- Database ' + @db
    EXEC ('USE ' + @db)

    -- Selecting all the users of the current database
    DECLARE user_cursor CURSOR FOR SELECT name FROM MASTER.sys.database_principals WHERE type NOT IN ('R', 'X')


    OPEN user_cursor
    FETCH NEXT FROM user_cursor INTO @user

    WHILE @@FETCH_STATUS = 0
    BEGIN

        PRINT ' -- User : ' + @user

        FETCH NEXT FROM user_cursor INTO @user

    END

    CLOSE user_cursor
    DEALLOCATE user_cursor

    FETCH NEXT FROM db_cursor INTO @db
END

CLOSE db_cursor
DEALLOCATE db_cursor

完整的代码是:

DECLARE @db VARCHAR(256) -- DB name
DECLARE @user VARCHAR(256) -- Username

DECLARE db_cursor CURSOR FOR
SELECT name FROM MASTER.sys.databases
WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb')


OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @db

WHILE @@FETCH_STATUS = 0
BEGIN

    PRINT ' -- Database ' + @db

    DECLARE user_cursor CURSOR FOR
    SELECT name FROM MASTER.sys.database_principals
    WHERE type NOT IN ('R', 'X')
        AND sid is not null
        and name != 'guest'


    OPEN user_cursor
    FETCH NEXT FROM user_cursor INTO @user

    WHILE @@FETCH_STATUS = 0
    BEGIN

        PRINT ' -- User : ' + @user

        SELECT 'ALTER ROLE  [' + roles.name + '] ADD MEMBER [' + users.name + '];'
        from sys.database_principals users
        inner join sys.database_role_members link
        on link.member_principal_id = users.principal_id
        inner join sys.database_principals roles
        on roles.principal_id = link.role_principal_id
        where users.name = @user

        FETCH NEXT FROM user_cursor INTO @user

    END

    CLOSE user_cursor
    DEALLOCATE user_cursor

    FETCH NEXT FROM db_cursor INTO @db
END

CLOSE db_cursor
DEALLOCATE db_cursor

目标是通过将ALTER的所有用户分配给他们适当的角色来改变他们

问题是并非所有用户都可以访问。 用户属于 AD 组。

先感谢您

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM