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

Tildeling af adgang til en db til brugere/roller af en anden

Formentlig vil du bruge et login, der har adgang til begge databaser (såsom tilfældet med SA). Du skal oprette den passende rolle og tildele rettigheder til hver database og derefter oprette brugeren (linket til det login, du bruger) i begge, og tilføje hver til den rolle, du har oprettet.

T-SQL vil se sådan her ud:

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 jeg oprette forbindelse til test og udfør

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

Selvfølgelig ville du ændre dine bevillinger til EXECUTE på de ønskede lagrede procedurer, men det ser ud til, at du allerede har fået det dækket.

Derefter handler det bare om at udføre et simpelt script for at oprette logins, brugere og tilføje dem til 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

Synkroniser logins, brugere og roller automatisk

Dette script vil finde alle SQL-login (du kan ændre dette til det, der giver mening for dig; windows OG SQL-konti, konti, der indeholder en bestemt streng, hvad som helst), sikre, at brugeren er oprettet i database1 og database2 , og sikrer, at de begge er tilføjet til reporting rolle. Du skal sikre dig reporting rolle oprettes på begge databaser, men du behøver kun at gøre dette én gang.

Derefter kan du køre dette script med jævne mellemrum, enten manuelt eller ved hjælp af et SQL Agent-job. Alt du skal gøre er at oprette login til serveren; når scriptet kører vil det klare 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 vil gerne tilføje en transaktion og fejlhåndtering for at udrulle ufuldstændige ændringer, men det overlader jeg til dig.



  1. Få tællinger af UNIQUE records OVERAL pr. værdi

  2. Hvordan roterer man PgBouncer-logfiler i Linux/Windows?

  3. Hvordan fjerner jeg de første tegn i en bestemt kolonne i en tabel?

  4. Hvordan kan jeg bruge cPanel til at uploade php-filer og database?