संभवतः, आप एक ऐसे लॉगिन का उपयोग कर रहे होंगे जिसके पास दोनों डेटाबेस (जैसे SA के मामले में) तक पहुंच हो। आप उपयुक्त भूमिका बनाएंगे और प्रत्येक डेटाबेस को अधिकार देंगे, फिर दोनों में उपयोगकर्ता (आपके द्वारा उपयोग किए जा रहे लॉगिन से जुड़ा हुआ) बनाएंगे, प्रत्येक को आपके द्वारा बनाई गई भूमिका में जोड़ देंगे।
टी-एसक्यूएल कुछ इस तरह दिखेगा:
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
अधूरे बदलावों को शुरू करने के लिए आप एक लेन-देन और त्रुटि प्रबंधन जोड़ना चाहेंगे, लेकिन मैं इसे आप पर छोड़ दूंगा।