Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Memberikan akses ke satu db kepada pengguna/peran orang lain

Agaknya, Anda akan menggunakan login yang memiliki akses ke kedua database (seperti halnya dengan SA). Anda akan membuat peran yang sesuai dan memberikan hak untuk setiap database, lalu membuat pengguna (tertaut ke login yang Anda gunakan) di keduanya, menambahkan masing-masing ke peran yang Anda buat.

T-SQL akan terlihat seperti ini:

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

Sekarang saya dapat terhubung ke test dan jalankan

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

Tentu saja, Anda akan mengubah hibah Anda menjadi EXECUTE pada prosedur tersimpan yang diinginkan, tetapi sepertinya Anda sudah mendapatkannya.

Setelah itu, tinggal menjalankan skrip sederhana untuk membuat login, pengguna, dan menambahkannya ke peran.

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

Menyinkronkan login, pengguna, dan peran secara otomatis

Skrip ini akan menemukan semua login SQL (Anda dapat mengubahnya ke apa pun yang masuk akal bagi Anda; akun windows DAN SQL, akun yang berisi string tertentu, apa pun), pastikan pengguna telah dibuat di database1 dan database2 , dan memastikan keduanya ditambahkan ke reporting peran. Anda perlu memastikan reporting role dibuat di kedua database, tetapi Anda hanya perlu melakukannya sekali.

Setelah itu, Anda dapat menjalankan skrip ini secara berkala, baik secara manual, atau menggunakan pekerjaan SQL Agent. Yang perlu Anda lakukan adalah membuat login untuk server; saat skrip dijalankan, sisanya akan dilakukan.

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

Anda ingin menambahkan transaksi dan penanganan kesalahan untuk meluncurkan perubahan yang tidak lengkap, tetapi saya akan menyerahkannya kepada Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menangkap SqlException yang disebabkan oleh kebuntuan?

  2. RODBC odbcDriverConnect() Kesalahan Koneksi

  3. Perubahan penting untuk Acara yang Diperpanjang di SQL Server 2012

  4. Perbandingan datetime SQL Server dalam format yang berbeda

  5. Menata ulang dan menghapus duplikasi kolom SQL berdasarkan data kolom