sql >> Database >  >> RDS >> Sqlserver

Toegang verlenen tot één db aan gebruikers/rollen van een ander

Vermoedelijk gebruikt u een login die toegang heeft tot beide databases (zoals het geval met SA). U maakt de juiste rol aan en verleent rechten aan elke database, en maakt vervolgens de gebruiker (gekoppeld aan de login die u gebruikt) in beide, en voegt elk toe aan de rol die u hebt gemaakt.

De T-SQL ziet er ongeveer zo uit:

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

Nu kan ik verbinding maken met test en uitvoeren

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

Natuurlijk zou je je subsidies veranderen in UITVOEREN voor de gewenste opgeslagen procedures, maar het lijkt erop dat je dat al hebt gedekt.

Daarna gaat het gewoon om het uitvoeren van een eenvoudig script om aanmeldingen en gebruikers te maken en deze aan de rol toe te voegen.

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

Aanmeldingen, gebruikers en rollen automatisch synchroniseren

Dit script zal alle SQL-aanmeldingen vinden (u kunt dit wijzigen in wat voor u logisch is; windows EN SQL-accounts, accounts die een bepaalde string bevatten, wat dan ook), zorg ervoor dat de gebruiker is aangemaakt in database1 en database2 , en zorgt ervoor dat ze beide worden toegevoegd aan de reporting rol. U moet zorgen voor de reporting rol wordt aangemaakt op beide databases, maar u hoeft dit maar één keer te doen.

Daarna kunt u dit script periodiek uitvoeren, handmatig of met een SQL Agent-taak. Het enige wat u hoeft te doen is de login voor de server aan te maken; wanneer het script wordt uitgevoerd, doet het de 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

U wilt een transactie en foutafhandeling toevoegen om onvolledige wijzigingen ongedaan te maken, maar dat laat ik aan u over.



  1. haal de waarde van de primaire sleutel van gegevens op als de index voor de associatieve array

  2. Laravel &multiple count queries met Eloquent

  3. Hoe maak je een reeks in MySQL

  4. MySQL-aaneenschakelingsoperator