sql >> Databasteknik >  >> RDS >> Sqlserver

Bevilja åtkomst till en db till användare/roller för en annan

Förmodligen skulle du använda en inloggning som har åtkomst till båda databaserna (som fallet med SA). Du skulle skapa lämplig roll och bevilja rättigheter till varje databas och sedan skapa användaren (länkad till inloggningen du använder) i båda och lägga till var och en till rollen du skapade.

T-SQL kommer att se ut ungefär så här:

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 jag ansluta till test och kör

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

Naturligtvis skulle du ändra dina anslag till EXECUTE på de önskade lagrade procedurerna, men det verkar som att du redan har det täckt.

Efter det är det bara att köra ett enkelt skript för att skapa inloggningar, användare och lägga till dem i rollen.

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

Synkronisera inloggningar, användare och roller automatiskt

Detta skript kommer att hitta alla SQL-inloggningar (du kan ändra detta till vad som är vettigt för dig; windows OCH SQL-konton, konton som innehåller en viss sträng, vad som helst), se till att användaren har skapats i database1 och database2 , och säkerställer att de båda läggs till i reporting roll. Du måste säkerställa reporting roll skapas på båda databaserna, men du behöver bara göra detta en gång.

Efter det kan du köra det här skriptet med jämna mellanrum, antingen manuellt eller med ett SQL Agent-jobb. Allt du behöver göra är att skapa inloggningen för servern; när skriptet körs gör det resten.

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

Du kommer att vilja lägga till en transaktion och felhantering för att rulla ut ofullständiga ändringar, men jag överlåter det till dig.



  1. Hur många frågor är för många?

  2. Hur genererar UNIKA slumptal i php

  3. Lära 2 - 2 decimaler på ett flöte?

  4. Kör ett skalskript när en databaspost skrivs till postgres