Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Concessione dell'accesso a un db a utenti/ruoli di un altro

Presumibilmente, useresti un login che ha accesso a entrambi i database (come nel caso di SA). Dovresti creare il ruolo appropriato e concedere i diritti a ciascun database, quindi creare l'utente (collegato al login che stai utilizzando) in entrambi, aggiungendo ciascuno al ruolo che hai creato.

Il T-SQL avrà un aspetto simile a questo:

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

Ora posso connettermi a test ed esegui

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

Ovviamente, cambieresti le tue sovvenzioni in ESEGUI sulle stored procedure desiderate, ma sembra che tu l'abbia già coperto.

Dopodiché, si tratta solo di eseguire un semplice script per creare accessi, utenti e aggiungerli al ruolo.

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

Sincronizzazione automatica di accessi, utenti e ruoli

Questo script troverà tutti gli accessi SQL (puoi cambiarlo in qualsiasi cosa abbia senso per te; account Windows E SQL, account che contengono una determinata stringa, qualunque cosa), assicurati che l'utente sia stato creato in database1 e database2 e assicura che siano entrambi aggiunti al reporting ruolo. Dovrai assicurarti la reporting il ruolo viene creato su entrambi i database, ma devi farlo solo una volta.

Successivamente, puoi eseguire questo script periodicamente, manualmente o utilizzando un processo di SQL Agent. Tutto quello che devi fare è creare il login per il server; quando lo script viene eseguito, farà il resto.

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

Ti consigliamo di aggiungere una transazione e una gestione degli errori per annullare le modifiche incomplete, ma lascio a te.