[英]How to move/copy all databases with users, schema and roles from one server to another
[英]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帳戶,包含特定字符串的帳戶,等等),確保已在database1
和database2
創建用戶,並確保它們都是添加到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.