2010-08-23 12 views
7

मेरे पास एक संग्रहीत प्रक्रिया है जो सभी मौजूदा डेटाबेस पाती है और प्रत्येक में एक तालिका से पढ़ती है।एसक्यूएल सर्वर - सभी मौजूदा और भविष्य डेटाबेस तक पहुंच पढ़ने के लिए लॉगिन अनुमति दें

क्या कोई तरीका है कि मैं सभी डेटाबेसों में लॉगिन रीडिंग पहुंच दे सकता हूं, और सभी भावी डेटाबेसों के लिए, यानी, जब कोई नया डेटाबेस जोड़ा जाता है तो मुझे कुछ भी नहीं करना पड़ेगा?

क्या कोई सर्वर भूमिका है जो काम करेगी? क्या SQL एजेंट जॉब को किसी भी नए डेटाबेस पर अनुमतियां जोड़ने का कोई तरीका है? या क्या कोई और तरीका है?

उत्तर

9

नए डेटाबेस के लिए, मॉडल डेटाबेस में उपयोगकर्ता जोड़ें। यह सभी नए डेटाबेस के लिए टेम्पलेट के रूप में प्रयोग किया जाता है।

USE model 
CREATE USER ... FROM LOGIN... 
EXEC sp_addrolemember 'db_datareader', '...' 

मौजूदा डेटाबेस के लिए, sp_MSForEachDb

EXEC sp_MSForEachDb ' 
USE ? 
CREATE USER ... FROM LOGIN... 
EXEC sp_addrolemember ''db_datareader'', ''...'' 
' 
का उपयोग
+0

उपयोगकर्ता स्वचालित रूप से उस चलाने के बाद से पढ़ने की पहुँच प्राप्त होगी ? – Greg

+0

ठीक है, आपको कुछ अधिकार भी देना होगा, लेकिन उनके पास डीबी एक्सेस – gbn

+0

होगा, मैं टेबल पर पढ़ने के अधिकार कैसे प्रदान कर सकता हूं? अन्यथा मैं वापस आ गया हूं जहां मैंने शुरू किया था। – Greg

1

उपयोग [गुरु] GO --IF नहीं मौजूद है (syslogins से चुनें * जहां LOGINNAME = 'लॉग इन नाम से प्रतिस्थापित') - प्रवेश बनाएं DEFAULT_DATABASE = [गुरु] --GO घोषित @SQL VARCHAR (मैक्स) घोषित @DatabaseName VARCHAR (255)

साथ खिड़कियों से [लॉग इन नाम से प्रतिस्थापित] SYSDATABASES से --लेबल नाम के लिए

घोषित crFetch कर्सर में नाम - ('मास्टर', 'मॉडल', 'tempdb', 'msdb', 'वितरण')

SYS से चयन का नाम।डेटाबेस जहां नाम ('मास्टर', 'मॉडल', 'tempdb', 'msdb', 'वितरण') में

खुली crFetch crFetch जांच @DatabaseName से

जबकि @@ FETCH_STATUS < अगला फ़ेच नहीं > -1 '+' शुरू

सेट @SQL =

'का उपयोग [' + @DatabaseName + ']' + 'नहीं तो मौजूद है (sysusers से नाम का चयन करें जहां नाम =' '' + ' लॉगिन नाम '+' '' '+' के साथ प्रतिस्थापित करें) ' ' उपयोगकर्ता बनाएं [आर लॉगिन नाम के साथ बदलें] लॉग इन के लिए [लॉगिन नाम के साथ प्रतिस्थापित करें] '+ ' EXEC sp_addrolemember एन '+' '' '+' db_ETL '+' '' '+', एन '+' '' '+' लॉगिन 'के साथ प्रतिस्थापित करें नाम '+' '' '+' '

-' EXEC sp_addrolemember एन '+' '' db_datareader '+' '+' '' '+', एन '+' '' '+' के साथ बदलें लॉगिन नाम '+' '' '+ -' यदि अस्तित्व में नहीं है (sysusers से नाम का चयन करें जहां नाम = '+' '' '' 'db_executor' + '' '' '' '' और issqlrole = 1) ' - - ROLE db_executor '+' + - 'अनुदान दें db_executor' + '+ -' EXEC sp_addrolemember n '+' '' '+' db_executor '+' '' '+', n ' + '' '' '' + '' नाम बदलें लॉगिन नाम '+' '' '+'

--PRINT @SQL

EXEC (@SQL)

से crFetch जांच @DatabaseName अंत अगला फ़ेच

बंद crFetch पुनःआवंटन crFetch

संबंधित मुद्दे