簡體   English   中英

授予對另一個數據庫的用戶/角色的訪問權限

[英]Granting access to one db to users/roles of another

簡短版本:我可以向外部數據庫授予對角色的訪問權限嗎?

長版:

我正在處理使用Crystal的報告,Crystal正在從應用程序SQL Server實例( database1 )中檢索數據。

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

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

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

我假設錯誤是由新的數據庫權限引起的,就像我以SA身份登錄應用程序時錯誤消失了。

對於運行報表的用戶,應用程序具有特殊的DB角色,在將表/ view / sp添加到應用程序db( database1 )時,我可以簡單地向此角色授予select / execute以允許報表訪問對象。

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

有什么方法可以通過現有角色引用第二個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]

理想情況下,我希望能夠以某種方式鏈接到角色而不是重新創建新角色,因為在添加/配置新用戶時,應用程序會定期更新角色。

(未標記為Crystal-Reports,因為這與問題無關)

編輯:

有什么方法可以做以下事情:

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

要復制用戶(不是登錄),然后添加角色成員?

據推測,您將使用可訪問兩個數據庫的登錄(例如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登錄(您可以將其更改為對您有意義的任何內容;窗口和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

您將需要添加事務和錯誤處理以滾動不完整的更改,但我會將其留給您。

將存儲過程設置為以所有者身份執行。

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

使用該過程將存儲過程的執行權限授予數據庫上的相應用戶或角色。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM