Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Accorder l'accès à une base de données aux utilisateurs/rôles d'une autre

Vraisemblablement, vous utiliseriez une connexion qui a accès aux deux bases de données (comme dans le cas de SA). Vous créerez le rôle approprié et accorderez des droits à chaque base de données, puis créerez l'utilisateur (lié à la connexion que vous utilisez) dans les deux, en ajoutant chacun au rôle que vous avez créé.

Le T-SQL ressemblera à ceci :

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

Maintenant, je peux me connecter à test et exécuter

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

Bien sûr, vous modifieriez vos autorisations en EXECUTE sur les procédures stockées souhaitées, mais il semble que vous ayez déjà couvert cela.

Après cela, il s'agit simplement d'exécuter un script simple pour créer des identifiants, des utilisateurs et les ajouter au rôle.

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

Synchronisation automatique des identifiants, des utilisateurs et des rôles

Ce script trouvera toutes les connexions SQL (vous pouvez changer cela en ce qui vous semble logique ; comptes Windows ET SQL, comptes contenant une certaine chaîne, peu importe), assurez-vous que l'utilisateur a été créé dans database1 et database2 , et s'assure qu'ils sont tous les deux ajoutés au reporting rôle. Vous devrez vous assurer du reporting rôle est créé sur les deux bases de données, mais vous n'avez besoin de le faire qu'une seule fois.

Après cela, vous pouvez exécuter ce script périodiquement, soit manuellement, soit à l'aide d'un travail de l'Agent SQL. Tout ce que vous avez à faire est de créer la connexion pour le serveur ; lorsque le script s'exécute, il fera le reste.

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

Vous souhaiterez ajouter une transaction et une gestion des erreurs pour supprimer les modifications incomplètes, mais je vous laisse le soin de le faire.