Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Gewähren von Zugriff auf eine Datenbank für Benutzer/Rollen einer anderen

Vermutlich würden Sie ein Login verwenden, das Zugriff auf beide Datenbanken hat (wie im Fall von SA). Sie würden die entsprechende Rolle erstellen und jeder Datenbank Rechte gewähren, dann den Benutzer (verknüpft mit dem von Ihnen verwendeten Login) in beiden erstellen und jeden der von Ihnen erstellten Rolle hinzufügen.

Das T-SQL sieht etwa so aus:

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

Jetzt kann ich mich mit test verbinden und ausführen

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

Natürlich würden Sie Ihre Erteilungen für die gewünschten gespeicherten Prozeduren in EXECUTE ändern, aber es sieht so aus, als hätten Sie das bereits abgedeckt.

Danach geht es nur noch darum, ein einfaches Skript auszuführen, um Anmeldungen und Benutzer zu erstellen und sie der Rolle hinzuzufügen.

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

Logins, Benutzer und Rollen automatisch synchronisieren

Dieses Skript findet alle SQL-Logins (Sie können dies ändern, was immer für Sie sinnvoll ist; Windows UND SQL-Konten, Konten, die eine bestimmte Zeichenfolge enthalten, was auch immer), stellen Sie sicher, dass der Benutzer in database1 erstellt wurde und database2 , und stellt sicher, dass beide zum reporting hinzugefügt werden Rolle. Sie müssen die reporting sicherstellen Rolle wird auf beiden Datenbanken erstellt, aber Sie müssen dies nur einmal tun.

Danach können Sie dieses Skript regelmäßig ausführen, entweder manuell oder mithilfe eines SQL Agent-Auftrags. Alles, was Sie tun müssen, ist das Login für den Server zu erstellen; Wenn das Skript ausgeführt wird, erledigt es den Rest.

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

Sie werden eine Transaktion und eine Fehlerbehandlung hinzufügen wollen, um unvollständige Änderungen rückgängig zu machen, aber das überlasse ich Ihnen.