sql >> データベース >  >> RDS >> Sqlserver

あるデータベースへのアクセスを別のデータベースのユーザー/ロールに許可する

    おそらく、両方のデータベースにアクセスできるログインを使用しているでしょう(SAの場合など)。適切なロールを作成し、各データベースに権限を付与してから、両方でユーザー(使用しているログインにリンクされている)を作成し、作成したロールにそれぞれを追加します。

    T-SQLは次のようになります。

    use master
    go
    create login testuser with password = 'mypassword123'
    go
    
    use test
    go
    
    create role reporting
    grant select on something to reporting -- grant your permissions here
    
    create user testuser for login testuser
    exec sp_addrolemember 'reporting', 'testuser'
    go
    
    use test2
    go
    
    create role reporting
    grant select on something2 to reporting -- grant your permissions here
    
    create user testuser for login testuser
    exec sp_addrolemember 'reporting', 'testuser'
    go
    

    これで、testに接続できます 実行

     select * from something
     select * from test2.dbo.something2
    

    もちろん、必要なストアドプロシージャで付与をEXECUTEに変更しますが、すでにそれをカバーしているようです。

    その後は、簡単なスクリプトを実行してログインとユーザーを作成し、それらをロールに追加するだけです。

    declare @sql nvarchar(max), @username nvarchar(50), @password nvarchar(50)
    
    -- ########## SET PARAMETERS HERE
    SET @username = N'testguy'
    SET @password = N'test123'
    -- ########## END SET PARAMETERS
    
    set @sql = N'USE master; CREATE LOGIN [' + @username + N'] WITH PASSWORD = N''' + @password + N'''; USE database1; CREATE USER [' + @username + N'] FOR LOGIN [' + @username + N']; EXEC sp_addrolemember ''reporting'', ''' + @username + N''';  USE database2; CREATE USER [' + @username + N'] FOR LOGIN [' + @username + N']; EXEC sp_addrolemember ''reporting'', ''' + @username + N''';'
    exec sp_executesql @sql
    

    ログイン、ユーザー、ロールを自動的に同期する

    このスクリプトはすべてのSQLログインを検索し(これは自分にとって意味のあるものに変更できます。WindowsとSQLアカウント、特定の文字列を含むアカウントなど)、ユーザーがdatabase1で作成されていることを確認します。 およびdatabase2 、および両方がreportingに追加されていることを確認します 役割。 reportingを確認する必要があります 役割は両方のデータベースで作成されますが、これを行う必要があるのは1回だけです。

    その後、このスクリプトを定期的に、手動で、またはSQLエージェントジョブを使用して実行できます。サーバーのログインを作成するだけです。スクリプトが実行されると、残りは実行されます。

    declare @login nvarchar(50), @user1 nvarchar(50), @user2 nvarchar(50), @sql nvarchar(max), @rolename nvarchar(50)
    
    SET @rolename = 'reporting'
    
    declare c cursor for 
    select sp.name as login, dp1.name as user1, dp2.name as user2 from sys.server_principals as sp
        left outer join database1.sys.database_principals as dp1 on sp.sid = dp1.sid
        left outer join database2.sys.database_principals as dp2 on sp.sid = dp2.sid
    where sp.type = 'S' 
        and sp.is_disabled = 0
    
    open c
    
    fetch next from c into @login, @user1, @user2
    
    while @@FETCH_STATUS = 0 begin
    
        -- create user in db1
        if (@user1 is null) begin
            SET @sql = N'USE database1; CREATE USER [' + @login + N'] FOR LOGIN [' + @login + N'];'
            EXEC sp_executesql @sql
        end
    
        -- ensure user is member of role in db1
        SET @sql = N'USE database1; EXEC sp_addrolemember '''+ @rolename + ''', ''' + @login + N''';'
        EXEC sp_executesql @sql
    
         -- create user in db2
        if (@user2 is null) begin
            SET @sql = N'USE database2; CREATE USER [' + @login + N'] FOR LOGIN [' + @login + N'];'
            EXEC sp_executesql @sql
        end
    
        -- ensure user is member of role in db2
        SET @sql = N'USE database2; EXEC sp_addrolemember '''+ @rolename + ''', ''' + @login + N''';'
        EXEC sp_executesql @sql
    
        fetch next from c into @login, @user1, @user2
    end
    
    
    close c
    deallocate c
    

    不完全な変更をロールオフするためにトランザクションとエラー処理を追加することをお勧めしますが、それはあなたに任せます。



    1. SQLサーバーでNULLを空白値またはゼロに置き換えます

    2. PHPクエリの結果を列に分割する

    3. MySQLトリガーからのPHPスクリプトの呼び出し

    4. Cakephpの2つのモデル間でテーブルをリンクする