2012-06-18 39 views
5

Phiên bản ngắn: Tôi có thể cấp quyền truy cập vào cơ sở dữ liệu bên ngoài cho vai trò không?Cấp quyền truy cập cho một db cho người dùng/vai trò của một số

phiên bản Long:

tôi đang làm việc trên các báo cáo sử dụng Crystal được lấy dữ liệu từ một ứng dụng SQL Server Instance (database1).

Ứng dụng đang chạy báo cáo và ghi đè kết nối trong báo cáo, tôi không có quyền truy cập vào mã ứng dụng.

Tôi đã thêm một DB mới vào máy chủ (database2) đang thu thập thông tin từ trao đổi qua điện thoại và tôi muốn tham gia một số thông tin này vào dữ liệu ứng dụng (database1).

Tôi có thể tham gia dữ liệu và báo cáo hoạt động khi chạy bên trong trình thiết kế (đăng nhập bằng SA) nhưng khi báo cáo được chạy bên ngoài thông qua ứng dụng mà chúng không thành công với lỗi khá chung chung (Không thể truy xuất dữ liệu).

Tôi giả định lỗi đang được gây ra bởi các quyền DB mới như thể tôi đăng nhập vào ứng dụng khi SA lỗi biến mất.

Ứng dụng có vai trò DB đặc biệt cho người dùng chạy báo cáo, khi thêm bảng/khung/sp vào ứng dụng db (database1) Tôi có thể chỉ cần chọn/thực thi vai trò này để cho phép báo cáo truy cập đối tượng .

Bây giờ tôi có đối tượng trong một db khác nhau tuy nhiên vai trò không dễ dàng truy cập.

Có cách nào tôi có thể tham chiếu đến db thứ hai (database2) thông qua vai trò hiện tại không?

ví dụ:

USE [database1] 
GRANT EXECUTE ON [database2].[dbo].[CUSTOM_PROCEDURE] TO [applicationrole1] 

OR 

USE [database2] 
GRANT EXECUTE ON [dbo].[CUSTOM_PROCEDURE] TO [database1].[dbo].[applicationrole1] 

Lý tưởng nhất là tôi muốn để có thể liên kết đến các Role bằng cách nào đó chứ không phải tái tạo một vai trò mới như vai trò được cập nhật bởi các ứng dụng thường xuyên khi người dùng mới được thêm vào/cấu hình.

(Không được gắn thẻ với Crystal Reports-vì điều này không liên quan đến vấn đề)

Edit:

Có cách nào để làm điều gì đó như:

INSERT INTO Database2.sys.database_principals 
SELECT * FROM Database1.sys.database_principals 
WHERE [type] = 'S' 

Để sao chép qua Người dùng (không phải đăng nhập) và sau đó thêm các thành viên vai trò?

Trả lời

3

Có lẽ, bạn sẽ 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 mỗi vai trò vào vai trò bạn đã tạo.

T-SQL sẽ giống như thế này:

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 hiện

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

Tất nhiên, bạn muốn thay đổi các khoản tài trợ của bạn để EXECUTE trên mong muốn các thủ tục được lưu trữ, nhưng có vẻ như bạn đã được bảo hiểm.

Sau đó, đó chỉ là 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 chúng vào vai trò. đăng nhập

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 

Đồng bộ hoá, người sử dụng, và vai trò tự động

Kịch bản này sẽ tìm thấy tất cả các thông tin đăng nhập SQL (bạn có thể thay đổi điều này để bất cứ điều gì có ý nghĩa đối với bạn; Windows và các tài khoản SQL, tài khoản có chứa một chuỗi nhất định, bất kỳ điều gì), đảm bảo người dùng đã được tạo trong database1database2 và đảm bảo họ được thêm vào vai trò reporting. Bạn sẽ cần đảm bảo vai trò reporting đượ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 định kỳ, theo cách thủ công hoặc sử dụng tác vụ Đại lý SQL. Tất cả những gì bạn cần làm là tạo đăng nhập cho máy chủ; khi kịch bản chạy nó sẽ làm 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 giao dịch và xử lý lỗi để loại bỏ các thay đổi không đầy đủ, nhưng tôi sẽ để điều đó tùy thuộc vào bạn.

+0

Có cách nào có thể thực hiện được cho người dùng mới được thêm vào 'database1' không? – bendataclear

+0

Đối với bất kỳ người dùng bổ sung nào bạn cần thêm, chỉ cần sử dụng tên người dùng 'CREATE USER [tên người dùng] FOR LOGIN [tên đăng nhập]' và 'exec sp_addrolemember ...' trên mỗi cơ sở dữ liệu (Bạn có thể bỏ qua phần CREATE USER nếu bạn đã tạo ra người dùng trong mỗi cơ sở dữ liệu, nói, thông qua quản lý phòng thu). – HackedByChinese

+0

Người dùng mới được thêm vào rất thường xuyên và phải chạy các tập lệnh này mỗi lần có thể khó khăn. Có cách nào để phản ánh thông tin đăng nhập không? – bendataclear

0

Đặt thủ tục được lưu trữ để thực thi với tư cách là chủ sở hữu.

http://msdn.microsoft.com/en-us/library/ms188354.aspx

Đặt đáng tin cậy trên cơ sở dữ liệu mà thủ tục lưu trữ nằm.

http://technet.microsoft.com/en-us/library/ms187861.aspx

Đảm bảo rằng bạn có chủ sở hữu tương tự trên cả hai cơ sở dữ liệu.

http://msdn.microsoft.com/en-us/library/ms188676(v=sql.105).aspx

Grant thực hiện quyền truy cập vào các thủ tục lưu trữ cho người dùng hoặc vai trò thích hợp trên cơ sở dữ liệu với các thủ tục.

+0

Tôi đã thử bốn bước này nhưng lỗi ứng dụng vẫn bật lên, tôi cũng đã thử tạo một thủ tục lưu sẵn trong 'database1' gọi proc trong' database2' nhưng vẫn còn lỗi. – bendataclear

Các vấn đề liên quan