Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Przyznawanie dostępu do jednej bazy danych użytkownikom/rolom innego

Przypuszczalnie będziesz używać loginu, który ma dostęp do obu baz danych (tak jak w przypadku SA). Utworzyłbyś odpowiednią rolę i przyznał prawa do każdej bazy danych, a następnie utworzył użytkownika (powiązanego z loginem, którego używasz) w obu, dodając każdego do utworzonej roli.

T-SQL będzie wyglądał mniej więcej tak:

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

Teraz mogę połączyć się z test i wykonaj

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

Oczywiście możesz zmienić swoje granty na WYKONAJ w żądanych procedurach składowanych, ale wygląda na to, że już to masz pokryte.

Następnie wystarczy wykonać prosty skrypt, aby utworzyć loginy, użytkowników i dodać ich do roli.

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

Automatyczna synchronizacja loginów, użytkowników i ról

Ten skrypt znajdzie wszystkie loginy SQL (możesz to zmienić na dowolne, które ma dla Ciebie sens; konta Windows ORAZ SQL, konta zawierające określony ciąg, cokolwiek), upewnij się, że użytkownik został utworzony w database1 i database2 i zapewnia, że ​​obydwa zostaną dodane do reporting rola. Musisz upewnić się, że reporting rola jest tworzona w obu bazach danych, ale wystarczy to zrobić tylko raz.

Następnie możesz uruchamiać ten skrypt okresowo, ręcznie lub przy użyciu zadania agenta SQL. Wszystko, co musisz zrobić, to utworzyć login do serwera; kiedy skrypt zostanie uruchomiony, zajmie się resztą.

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

Będziesz chciał dodać transakcję i obsługę błędów, aby wycofać niekompletne zmiany, ale zostawię to Tobie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego Asp.net MVC4 nie może używać bez plików cookie przechowywania stanu sesji SQL Server?

  2. Jak grupować według ciągłych zakresów?

  3. Typ danych do przechowywania adresu IP w SQL Server

  4. Sprawdź, ile elementów poczty znajduje się w kolejce w poczcie bazy danych w programie SQL Server (T-SQL)

  5. Rozróżnianie według daty zamówienia i produktów SQL Server 2008