Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cấp quyền truy cập vào một db cho người dùng / vai trò của người khác

Có lẽ, bạn đang sử dụng thông tin đăng nhập có quyền truy cập vào cả hai cơ sở dữ liệu (chẳng hạn như trường hợp với SA). Bạn sẽ tạo vai trò thích hợp và cấp quyền cho từng cơ sở dữ liệu, sau đó tạo người dùng (được liên kết với thông tin đăng nhập bạn đang sử dụng) trong cả hai, thêm từng người vào vai trò bạn đã tạo.

T-SQL sẽ trông giống như sau:

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

Bây giờ tôi có thể kết nối với test và thực thi

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

Tất nhiên, bạn sẽ thay đổi các khoản trợ cấp của mình thành THỰC HIỆN trên các thủ tục được lưu trữ mong muốn, nhưng có vẻ như bạn đã có được điều đó.

Sau đó, chỉ cần thực hiện một tập lệnh đơn giản để tạo thông tin đăng nhập, người dùng và thêm họ vào vai trò.

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

Tự động đồng bộ hóa thông tin đăng nhập, người dùng và vai trò

Tập lệnh này sẽ tìm thấy tất cả thông tin đăng nhập SQL (bạn có thể thay đổi điều này thành bất kỳ điều gì phù hợp với bạn; tài khoản windows VÀ SQL, tài khoản có chứa một chuỗi nhất định, bất cứ điều gì), đảm bảo người dùng đã được tạo trong database1database2 và đảm bảo chúng đều được thêm vào reporting vai diễn. Bạn sẽ cần đảm bảo reporting vai trò được tạo trên cả hai cơ sở dữ liệu, nhưng bạn chỉ cần thực hiện việc này một lần.

Sau đó, bạn có thể chạy tập lệnh này theo định kỳ, theo cách thủ công hoặc sử dụng tác vụ SQL Agent. Tất cả những gì bạn cần làm là tạo thông tin đăng nhập cho máy chủ; khi tập lệnh chạy, nó sẽ thực hiện phần còn lại.

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ạn sẽ muốn thêm một giao dịch và xử lý lỗi để thực hiện các thay đổi chưa hoàn chỉnh, nhưng tôi sẽ để điều đó tùy thuộc vào bạn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để chọn từ danh sách các giá trị trong SQL Server

  2. Cách loại bỏ hoặc xóa tất cả các trình kích hoạt khỏi cơ sở dữ liệu trong SQL Server

  3. Các trường hợp sử dụng để chọn CHAR qua VARCHAR trong SQL là gì?

  4. Kích hoạt để ngăn Chèn cho dữ liệu trùng lặp của hai cột

  5. ĐẶT HÀNG BẰNG trong chế độ xem Sql Server 2008