2010-06-21 12 views
16

मुझे सर्वर पर सभी 300 डेटाबेस तक एक नया लॉगिन पढ़ने की आवश्यकता है। उपयोगकर्ता मानचित्रण क्षेत्र में 300 चेकबॉक्स की जांच किए बिना मैं इसे कैसे पूरा कर सकता हूं?एसक्यूएल सर्वर - लॉग इन करने के लिए सभी डेटाबेस तक पहुंच कैसे पढ़ा जाए?

उत्तर

17

एसएसएमएस में क्वेरी मेनू पर "टेक्स्ट टू परिणाम" सेट करने का एक तरीका नीचे दिए गए निष्पादित करना होगा।

यह वास्तव में परिवर्तन नहीं करता है लेकिन समीक्षा और निष्पादन के लिए आपके लिए एक स्क्रिप्ट उत्पन्न करता है।

SET NOCOUNT ON; 

DECLARE @user_name SYSNAME 
     , @login_name SYSNAME; 

SELECT @user_name = 'user_name', 
     @login_name = 'login_name' 

SELECT ' 
    USE ' + QUOTENAME(NAME) + '; 

    CREATE USER ' + QUOTENAME(@user_name) 
     + ' FOR LOGIN ' + QUOTENAME(@login_name) 
     + ' WITH DEFAULT_SCHEMA=[dbo]; 

    EXEC sys.sp_addrolemember 
     ''db_datareader'', 
     ''' + QUOTENAME(@user_name) + '''; 

    EXEC sys.sp_addrolemember 
     ''db_denydatawriter'', 
     ''' 
     + QUOTENAME(@user_name) + '''; 

GO 
' 
FROM sys.databases 
WHERE database_id > 4 
     AND state_desc = 'ONLINE' 

या आप आप पात्रों में से सभी को नहीं देख रहे हैं, तो जब आप इस चलाने के लिए, पाठ के लिए क्वेरी विकल्प खोलने और 'के लिए सेटिंग की जाँच sys.sp_MSforeachdbas here या हारून बर्ट्रेंड के उन्नत संस्करण here

पर दिखाई दे सकता है प्रत्येक कॉलम में प्रदर्शित वर्णों की अधिकतम संख्या '। सुनिश्चित करें कि यह सभी वर्णों को प्रदर्शित करने के लिए पर्याप्त मूल्य पर सेट है।

+2

मैं अभी इस sp_msforeachdb के बारे में क्यों सुन रहा हूं? मुझे लगता है कि मैं बस उन उपकरणों के साथ सबकुछ कोशिश कर रहा हूं जो मुझे पता है। खैर, मैं इसे टूलबॉक्स में जोड़ रहा हूं। धन्यवाद! – buckbova

+0

धन्यवाद! यह काम करने लग रहा था। मेरे पास उस क्वेरी के परिणामों को टेक्स्टपैड में कॉपी किया गया था और \ nGo \ n – Greg

+1

@ ग्रेग - ग्लेड ने काम किया था। क्या आपने इसे प्रबंधन स्टूडियो में चलाया था?यदि ऐसा है तो "टेक्स्ट टू परिणाम" (CTRL + T) विकल्प का चयन करने से शायद मध्यवर्ती चरण की आवश्यकता से बचा जा सकता है। –

5

डेटाबेस के माध्यम से कर्सर और प्रत्येक टी-एसक्यूएल के साथ प्रत्येक के लिए अनुदान पहुंच प्रदान करें।

मैंने नीचे दिए गए कोड का परीक्षण नहीं किया।

DECLARE db_cursor CURSOR FOR 
SELECT name 
FROM master.dbo.sysdatabases 
WHERE name NOT IN ('master','model','msdb','tempdb') 


WHILE @@FETCH_STATUS = 0 
BEGIN 

GRANT SELECT ON DATABASE::@name to 'username'; 

FETCH NEXT FROM db_cursor INTO @name 
END 
+0

उस बिंदु के बाद उपयोग करने के लिए टी-एसक्यूएल मेरा पॉइंट है भ्रम की टी। उस पर कोई संकेतक? – Greg

2
Declare @Databases Cursor 
Declare @DbName as nvarchar(64) 
Declare @Sql nvarchar(max) 
Declare @BaseAddUserSql nvarchar(max) 
Declare @BaseAddRoleSql nvarchar(max) 

Set @Databases = Cursor Fast_Forward For 
    select [name] 
    from master..sysdatabases 
    where [name] not in('master','model','msdb','tempdb') 

Open @Databases 
Fetch Next From @Databases Into @DbName 

Set @BaseAddUserSql = 'exec sp_adduser ''LOGINNAME''' 
Set @BaseAddRoleSql = 'exec sp_addrolemember ''db_datareader'', ''LOGINNAME''' 


While @@Fetch_Status = 0 
Begin 
    Begin Try 
     Set @Sql = 'Use ' + Quotename(@DbName) 
     exec (@Sql) 

     Set @Sql = Replace(@BaseAddUserSql, 'LOGINNAME', <loginname>) 
     exec(@Sql) 

     Set @Sql = Replace(@BaseAddRoleSql, 'LOGINNAME', <loginname>) 
     exec(@Sql) 
    End Try 
    Begin Catch 
    End Catch 

    Fetch Next From @Databases Into @DbName 
End 

Close @Databases 
Deallocate @Databases 
+0

यह कहता है कि यह सफलतापूर्वक पूरा हुआ लेकिन मुझे कोई बदलाव नहीं दिख रहा है। उपयोगकर्ता मैपिंग क्षेत्र नहीं बदला है। और लॉगिन जो मैंने के लिए रखा है, किसी भी डेटाबेस में उपयोगकर्ता के रूप में दिखाई नहीं देता है। कोई विचार? – Greg

+0

@ ग्रेग - आप फेंकने वाली त्रुटि को देखने के लिए Try-Catch ब्लॉक को टिप्पणी करना चाहेंगे। – Thomas

3
EXEC sp_MSForEachDB 
'Declare @name varchar(100) 
select @name = ''?'' 
PRINT @name 
IF db_id(@name) > 4 
BEGIN 
USE ? 
CREATE USER [user] FOR LOGIN [user]; 
EXEC sp_addrolemember ''db_datareader'', ''user'' 
END' 
2

मैं मार्टिन स्मिथ के जवाब थोड़ा बदलाव करने के लिए किया था के रूप में:

  1. रिक्त स्थान और लाइनब्रेक नहीं सभी पाठ के परिणामस्वरूप ठीक से नहीं बनाया जा रहा
  2. Exec बयान में डाल में QUOTENAME स्क्वायर ब्रैकेट जो गलत है।

मेरे संस्करण:

SET NOCOUNT ON; 

DECLARE @user_name SYSNAME 
     , @login_name SYSNAME; 

SELECT @user_name = 'HelpdeskUser', 
     @login_name = 'Helpdesk' 

SELECT 'USE ' + QUOTENAME(NAME) + '; 
     CREATE USER ' + QUOTENAME(@user_name) 
     + ' FOR LOGIN ' + QUOTENAME(@login_name) 
     + ' WITH DEFAULT_SCHEMA=[dbo]; 
    EXEC sys.sp_addrolemember ''db_datareader'',''' + @user_name + '''; 
    EXEC sys.sp_addrolemember ''db_denydatawriter'', ''' + @user_name + '''; 
GO' 
FROM sys.databases 
WHERE database_id > 4 
     AND state_desc = 'ONLINE' 

अन्यथा पूरी तरह से काम करता है। धन्यवाद

0

मुझे बस ऐसे उपयोगकर्ता की आवश्यकता है जिसके पास डेटा रीडर अनुमति के साथ सभी डेटाबेस तक पहुंच होगी, इसलिए मैंने इस कोड का उपयोग किया: आपको क्वेरी btw से परिणाम चलाने की आवश्यकता होगी।

USE [master] 
GO CREATE LOGIN [DOMAIN\USER] FROM WINDOWS WITH DEFAULT_DATABASE=[master] GO 
select 'use ['+name+'] 
CREATE USER [DOMAIN\USER] FOR LOGIN [DOMAIN\USER] 
EXEC sp_addrolemember N''db_datareader'', N''DOMAIN\USER'' 
' 
from sys.databases 

यदि आप सिस्टम डेटाबेस पर इसे लागू नहीं करना चाहते हैं तो बस जोड़ने जहां database_id> 6

0

आप इस तरह उदाहरण कर्सर के लिए उपयोग कर सकते हैं,:

USE master 
GO 

DECLARE @DatabaseName VARCHAR(32) 
DECLARE @SQL NVARCHAR(max) 
DECLARE @User VARCHAR(64) 
SET @User = '[SQL\srvSSISAcc]' --Your User 

DECLARE Grant_Permission CURSOR LOCAL FOR 
SELECT name FROM MASTER.dbo.sysdatabases 
WHERE name NOT IN ('master','model','msdb','tempdb') 

OPEN Grant_Permission 
FETCH NEXT FROM Grant_Permission INTO @DatabaseName 
WHILE @@FETCH_STATUS = 0 
BEGIN 

    SELECT @SQL = 'USE '+ '[' + @DatabaseName + ']' +'; '+ 'CREATE USER ' + @User + 
    'FOR LOGIN ' + @User + '; EXEC sp_addrolemember N''db_datareader'', 
    ' + @User + '; EXEC sp_addrolemember N''db_datawriter'', ' + @User + '' 

    EXEC sp_executesql @SQL 
    PRINT @SQL 

FETCH NEXT FROM Grant_Permission INTO @DatabaseName 
END 
CLOSE Grant_Permission 
DEALLOCATE Grant_Permission 

अधिक इस विषय के बारे में मेरी पोस्ट में जानकारी मिली: http://www.pigeonsql.com/single-post/2016/12/23/Grant-User-Access-to-All-Databases

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