1

私のオフィスに、相互に依存している複数のデータベースにアクセスする必要のある複数のユーザーがいるとしましょう。sysadminsのユーザーがいますが、従業員が増えるにつれて、sysadminsではないが、他のユーザーを変更する権限を付与せずに、特定のデータベースに対する所有者レベルの権限を必要とするこれらの新しいユーザーに特定の権限を適用できるようにしたいと考えています。それぞれを手動で追加するのではなく、ユーザーに適用してすべてのデータベースにアクセス許可を与える役割を作成するか、すべてのデータベースのユーザーにこれらのアクセス許可を与えるスキーマを作成するか、スクリプトを作成して与えたいと思います。すべてのデータベースのユーザーへのアクセス許可。例えば

DB1
 -sysadmin
     (contains user1, user2)
 -role1
     (contains user3, user4)
DB2
 -sysadmin
     (contains user1, user2)
 -role1
     (contains user3, user4)
DB3
 -sysadmin
     (contains user1, user2)
 -role1
     (contains user3, user4)

user3とuser4を一度role1に追加したいのですが、これらは3つのデータベース(DB1、DB2、DB3)すべてに対する権限を持ちます。私の理解では、これは基本的にサーバーレベルの役割ですが、私が読んだことから、カスタムサーバーレベルの役割を作成することは許可されていません。

また、私が理解しているように、スキーマはサーバーレベル固有ではなくデータベースレベル固有です(3つのデータベースを1つのスキーマにグループ化してから、そのスキーマにユーザーを追加することはできません)。

それで、それは私にスクリプトだけを残しますか、それとも私は役割またはスキーマでこれを行う方法を逃していますか?

4

1 に答える 1

1
DECLARE @username varchar(50) = 'mynewuser'
DECLARE @dbRole varchar(50)
DECLARE @SQL varchar(max)
DECLARE @DatabaseName varchar(MAX)

DECLARE my_cursor CURSOR FOR
    SELECT CAST([Name] AS varchar(MAX)) AS databasename
    FROM sys.sysdatabases
    --only user databases
    WHERE DBID>4 AND [NAME] NOT LIKE '$'
OPEN my_cursor

WHILE 1=1
BEGIN
    FETCH NEXT FROM my_cursor INTO @DatabaseName
    IF @@FETCH_STATUS <> 0 BEGIN BREAK END

    SET @SQL = '
        USE ' + @DatabaseName + ';
        IF NOT EXISTS(
            SELECT p.name 
            FROM ' + @DatabaseName + '.sys.database_principals p
            WHERE p.name = ''' + @username + '''
        )
        BEGIN
            USE ' + @DatabaseName + ';
            CREATE USER ' + @username + ' FOR LOGIN ' + @username + '
            EXEC sp_addrolemember ''db_owner'', ''' + @username + '''
        END'

    EXECUTE(@SQL)
END

CLOSE my_cursor
DEALLOCATE my_cursor
于 2011-10-04T14:16:51.250 に答える