Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Предоставяне на достъп до една база данни на потребители/роли на друга

Предполага се, че ще използвате потребителско име, което има достъп до двете бази данни (като случая със SA). Ще създадете подходящата роля и ще предоставите права на всяка база данни, след което ще създадете потребител (свързан с данните за вход, които използвате) и в двете, като добавите всеки към създадената от вас роля.

T-SQL ще изглежда по следния начин:

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

Сега мога да се свържа с test и изпълнете

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

Разбира се, бихте променили своите разрешения на EXECUTE за желаните съхранени процедури, но изглежда, че вече сте покрили това.

След това става дума само за изпълнение на прост скрипт за създаване на данни за вход, потребители и добавянето им към ролята.

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

Автоматично синхронизиране на влизания, потребители и роли

Този скрипт ще намери всички SQL влизания (можете да промените това на каквото има смисъл за вас; windows И SQL акаунти, акаунти, които съдържат определен низ, каквото и да е), уверете се, че потребителят е създаден в database1 и database2 и гарантира, че и двете са добавени към reporting роля. Ще трябва да осигурите reporting роля се създава и в двете бази данни, но трябва да направите това само веднъж.

След това можете да стартирате този скрипт периодично, или ръчно, или като използвате задача на SQL Agent. Всичко, което трябва да направите, е да създадете вход за сървъра; когато скриптът се изпълнява, той ще свърши останалото.

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

Ще искате да добавите транзакция и обработка на грешки, за да отмените непълните промени, но ще оставя това на вас.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да актуализирам от SELECT в SQL Server?

  2. sql география към dbgeography?

  3. Анализ на MS SQL Server за тези, които го виждат за първи път

  4. Цикъл на задействане на SQL Server

  5. SQL Server НА ИЗТРИВАНЕ Тригер