sql >> Base de Datos >  >> RDS >> Sqlserver

Otorgar acceso a una base de datos a usuarios/roles de otra

Presumiblemente, estaría utilizando un inicio de sesión que tiene acceso a ambas bases de datos (como en el caso de SA). Crearía el rol apropiado y otorgaría derechos a cada base de datos, luego crearía el usuario (vinculado al inicio de sesión que está utilizando) en ambos, agregando cada uno al rol que creó.

El T-SQL se verá así:

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

Ahora puedo conectarme a test y ejecutar

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

Por supuesto, cambiaría sus concesiones a EJECUTAR en los procedimientos almacenados deseados, pero parece que ya lo tiene cubierto.

Después de eso, solo se trata de ejecutar un script simple para crear inicios de sesión, usuarios y agregarlos al rol.

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

Sincronización automática de inicios de sesión, usuarios y roles

Este script encontrará todos los inicios de sesión de SQL (puede cambiar esto a lo que tenga sentido para usted; cuentas de Windows Y SQL, cuentas que contienen una determinada cadena, lo que sea), asegúrese de que el usuario se haya creado en database1 y database2 y se asegura de que ambos se agreguen a los reporting role. Deberá asegurarse de que los reporting el rol se crea en ambas bases de datos, pero solo necesita hacerlo una vez.

Después de eso, puede ejecutar este script periódicamente, ya sea manualmente o mediante un trabajo del Agente SQL. Todo lo que necesita hacer es crear el inicio de sesión para el servidor; cuando se ejecuta el script, hará el resto.

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

Querrá agregar una transacción y un manejo de errores para realizar cambios incompletos, pero eso se lo dejo a usted.