2012-06-18 99 views
5

簡短版本:我可以授予對某個角色的外部數據庫訪問權嗎?授予訪問一個數據庫給另一個用戶/角色的權限

龍版本:

我使用水晶被檢索從應用程序的SQL Server實例(database1)數據的報告工作。

應用程序正在運行報告並覆蓋報告中的連接,我無法訪問應用程序代碼。

我已經向服務器(database2)添加了一個新的數據庫,它正在從電話交換機收集信息,並且我想將這些信息加入應用數據(database1)。

我可以在設計器中運行時加入數據和報告(以SA身份登錄),但當報告通過應用程序從外部運行時,它們會以相當普遍的錯誤失敗(無法檢索數據)。

我假設錯誤是由新的數據庫權限造成的,就像我登錄到應用程序中一樣,錯誤消失。

當嚮應用程序數據庫添加表/視圖/ sp(database1)時,該應用程序對於運行報表的用戶具有特殊的數據庫角色我可以簡單地將選擇/執行授予此角色以允許報表訪問該對象。

現在我有一個不同的數據庫對象,但角色不容易訪問。

有沒有什麼辦法可以通過現有角色引用第二個db(database2)?

如:

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

OR 

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

理想我希望能夠鏈接到角色莫名其妙,而不是重新創建一個新的角色,角色是通過定期,當新用戶添加/配置的應用程序更新。

(未添加,因爲這是不相關的問題,水晶報表)

編輯:

有沒有辦法做這樣的事情:

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

要複製用戶(而不是登錄)並添加角色成員?

回答

3

大概你會使用一個可以訪問兩個數據庫的登錄名(例如SA的情況)。您將創建適當的角色並授予每個數據庫的權限,然後在兩者中創建用戶(鏈接到您正在使用的登錄名),將每個用戶添加到您創建的角色中。

的T-SQL會是這個樣子:

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 

現在我可以連接到test和執行

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

當然,你會改變你的授予EXECUTE所需存儲過程,但它看起來像你已經覆蓋。

之後,它只是執行一個簡單的腳本來創建登錄,用戶,並將它們添加到角色。

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 

正在同步登錄,用戶和角色自動

這個腳本會發現所有的SQL登錄(你可以改變這一切對你有意義; Windows和SQL帳戶,包含特定字符串賬戶,無論如何),請確保已在database1database2中創建用戶,並確保它們都被添加到reporting角色。您需要確保在兩個數據庫上都創建了reporting角色,但您只需要執行一次該操作。

之後,您可以定期運行此腳本(手動或使用SQL代理作業)。您只需爲服務器創建登錄名;當腳本運行時,剩下的就完成了。

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 

您將需要添加一個事務和錯誤處理來展開未完成的更改,但我會讓您自己決定。

+0

有沒有一種方法可以爲添加到'database1'的新用戶完成這項工作? – bendataclear

+0

對於任何需要添加的用戶,只需在每個數據庫上使用CREATE USER [用戶名] FOR LOGIN [登錄名]和[exec sp_addrolemember ...]部分(如果您已經可以省略CREATE USER部分通過管理工作室在每個數據庫中創建用戶)。 – HackedByChinese

+0

新用戶非常經常添加,每次運行這些腳本可能都很困難。有什麼方法來鏡像登錄? – bendataclear

0

將存儲過程設置爲作爲所有者執行。

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

設置在存儲過程所在的數據庫上可信賴的。

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

請確保您有兩個數據庫的所有者相同。

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

格蘭特在執行存儲過程的權限與程序對數據庫的適當的用戶或角色。

+0

我已經嘗試了這四個步驟,但應用程序錯誤仍然彈出,我也嘗試在'database1'中創建一個調用'database2'中的proc的存儲過程,但它仍然是錯誤。 – bendataclear

相關問題