sql >> Databáze >  >> RDS >> Sqlserver

Udělení přístupu k jedné databázi uživatelům/rolím jiné databáze

Pravděpodobně byste použili přihlašovací jméno, které má přístup k oběma databázím (jako v případě SA). Vytvořili byste příslušnou roli a udělili práva každé databázi, poté byste vytvořili uživatele (propojeného s přihlašovacím jménem, ​​které používáte) v obou a přidali každého do role, kterou jste vytvořili.

T-SQL bude vypadat nějak takto:

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

Nyní se mohu připojit k test a provést

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

Samozřejmě byste změnili své granty na EXECUTE u požadovaných uložených procedur, ale zdá se, že to již máte pokryto.

Poté už je to jen o spuštění jednoduchého skriptu pro vytvoření přihlašovacích údajů, uživatelů a jejich přidání do role.

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

Automatická synchronizace přihlašovacích údajů, uživatelů a rolí

Tento skript najde všechna přihlášení k SQL (můžete to změnit na cokoli, co vám dává smysl; účty Windows A SQL, účty, které obsahují určitý řetězec, cokoliv), ujistěte se, že uživatel byl vytvořen v database1 a database2 a zajistí, že budou oba přidány do reporting role. Budete muset zajistit reporting role je vytvořena v obou databázích, ale stačí to udělat pouze jednou.

Poté můžete tento skript spouštět pravidelně, buď ručně, nebo pomocí úlohy SQL Agent. Vše, co musíte udělat, je vytvořit přihlašovací jméno pro server; když se skript spustí, udělá zbytek.

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

Chcete-li odstranit neúplné změny, budete chtít přidat transakci a zpracování chyb, ale to nechám na vás.



  1. Nástěnka - Optimalizace databáze

  2. připojení aplikací pro Android k databázi mysql

  3. Vložení více tabulek s transakcí do mysql

  4. Vygenerujte hash řetězec MD5 pomocí T-SQL