2009-04-22 27 views
16

में उपयोगकर्ता बनाते हैं, यदि उपयोगकर्ता पहले से मौजूद नहीं है तो मैं डेटाबेस 'mydb' में उपयोगकर्ता 'foo' बनाना चाहता हूं। वर्तमान में मेरी स्क्रिप्ट इस तरह दिखता है:सशर्त रूप से SQL सर्वर

USE [mydb] 
CREATE USER [foo] FOR LOGIN [foo] 
GO 

लेकिन अगर उपयोगकर्ता पहले से मौजूद है, यह एक त्रुटि संदेश के साथ विफल रहता है:

Msg 15023, Level 16, State 1, Line 2 
User, group, or role 'jsrvpp' already exists in the current database. 

मैं स्क्रिप्ट बदल सकते हैं कैसे इतना है कि उपयोगकर्ता केवल अगर वे बनाई गई है पहले से मौजूद नहीं है?

धन्यवाद!

+0

[यह देखना कि SQL सर्वर लॉगिन पहले से मौजूद है] के संभावित डुप्लिकेट (http: // stackoverflow।com/प्रश्न/1379437/जाँच-अगर एक एसक्यूएल सर्वर-प्रवेश-पहले से ही मौजूद है SQL सर्वर 2005 मैं sysusers के बजाय sys.database_principals का उपयोग करें और के बजाय उपयोगकर्ता sp_grantdbaccess बनाएँ के साथ चिपके रहते हैं, उस पर नए विकास के लिए) – bummi

उत्तर

13

यह हमें क्या करना है ...

IF NOT EXISTS (SELECT * FROM DBO.SYSUSERS WHERE NAME = @usrName) 
BEGIN 
    PRINT 'Granting access to the current database to login ' + @usrName + '...' 
    -- Grant access to our database 
    EXEC SP_GRANTDBACCESS @usrName 
END ELSE BEGIN 
    PRINT 'Login ' + @usrName + ' already granted access to current database.' 
END 
+1

। – Matt

+1

@Matt क्या आप एक उत्तर जोड़ सकते हैं जो इस समाधान को दिखाता है? –

+0

एक वर्ष सा है, लेकिन यह 'sys.server_principals' और नहीं' इस मामले के लिए sys.database_principals' होना चाहिए। – codenamezero

25

आप अपने डेटाबेस के उपयोगकर्ताओं के लिए अपने विशिष्ट डेटाबेस में सर्वर लॉगिन, या sys.database_principals के लिए जाँच करने के लिए दो प्रणाली कैटलॉग sys.server_principals से परामर्श कर सकते हैं:

use myDB 
GO 

if not exists(select * from sys.database_principals where name = 'foo') 
    -- create your database user 


if not exists(select * from sys.server_principals where name = 'foo') 
    -- you need to create a server login first 

मार्क

+0

मैं डीबी (mydb) के नाम पर वहाँ में कहीं प्रकट करने के लिए उम्मीद करेंगे, मैं कुछ याद आ रही है? –

+1

आपको निश्चित रूप से अपने डीबी पर होना चाहिए, उदा। चेक –

13

मूलतः David's answer और marc_s's answer के संयोजन, के रूप में क्रिस से एक टिप्पणी से अनुरोध किया।

पुस्तकें ऑनलाइन sp_grantdbaccess का कहना है:

यह सुविधा Microsoft SQL सर्वर के एक भविष्य संस्करण में हटा दिया जाएगा। नए विकास कार्य में इस सुविधा का उपयोग करने से बचें, और पर योजनाओं को संशोधित करें जो वर्तमान में इस सुविधा का उपयोग करते हैं। इसके बजाय उपयोगकर्ता बनाएं का प्रयोग करें।

ही उपयोगकर्ता पहले से मौजूद नहीं है तो करने के लिए केवल एक उपयोगकर्ता बनाने के लिए, मैं इस तरह कुछ करना चाहते हैं:

/* Make sure User is created in the appropriate database. */ 
USE mydb 
GO 

/* Users are typically mapped to logins, as OP's question implies, 
so make sure an appropriate login exists. */ 
IF NOT EXISTS(SELECT principal_id FROM sys.server_principals WHERE name = 'foo') BEGIN 
    /* Syntax for SQL server login. See BOL for domain logins, etc. */ 
    CREATE LOGIN foo 
    WITH PASSWORD = 'sufficiently complex password' 
END 

/* Create the user for the specified login. */ 
IF NOT EXISTS(SELECT principal_id FROM sys.database_principals WHERE name = 'foo') BEGIN 
    CREATE USER foo FOR LOGIN foo 
END 

बहिष्कृत किए जाने के बावजूद, sp_grantdbaccess उपयोग करने में सक्षम होने का लाभ है डेविड के जवाब में उपयोगकर्ता/लॉगिन नाम के लिए एक पैरामीटर या स्थानीय चर। पहला विकल्प मैं CREATE USER के साथ काम करने के समान कुछ प्राप्त करने के बारे में सोच सकता था गतिशील एसक्यूएल का उपयोग करना था। उदाहरण के लिए:

/* Make sure User is created in the appropriate database. */ 
USE mydb 
GO 

DECLARE @NewUserName sysname; 
DECLARE @NewUsersLogin sysname; 

SET @NewUserName = 'foo'; 
SET @NewUsersLogin = 'bar'; 

/* Users are typically mapped to logins, as OP's question implies, 
so make sure an appropriate login exists. */ 
IF NOT EXISTS(SELECT principal_id FROM sys.server_principals WHERE name = @NewUsersLogin) BEGIN 
    /* Syntax for SQL server login. See BOL for domain logins, etc. */ 
    DECLARE @LoginSQL as varchar(500); 
    SET @LoginSQL = 'CREATE LOGIN '+ @NewUsersLogin + 
     ' WITH PASSWORD = ''sufficiently complex password'''; 
    EXEC (@LoginSQL); 
END 

/* Create the user for the specified login. */ 
IF NOT EXISTS(SELECT principal_id FROM sys.database_principals WHERE name = @NewUserName) BEGIN 
    DECLARE @UserSQL as varchar(500); 
    SET @UserSQL = 'CREATE USER ' + @NewUserName + ' FOR LOGIN ' + @NewUsersLogin; 
    EXEC (@UserSQL); 
END 
दिलचस्प बात यह

, पुस्तकें ऑनलाइन भी कहता है कि sp_grantdbaccess वास्तव में कॉल CREATE USER, और मैं अपने परीक्षण है कि यदि आप स्पष्ट रूप से एक स्कीमा निर्दिष्ट नहीं करते, sp_grantdbaccess एक उपयोगकर्ता के नाम पर पैदा करेगा में देखा है, जबकि CREATE USER डिफ़ॉल्ट रूप से 'dbo' का उपयोग करेगा।

0

मैं बिल्कुल वैसा ही पहले से ही विद्यमान जब स्क्रिप्ट चलाता एसक्यूएल उपयोगकर्ता के बारे में प्रश्न पूछा - सवाल है, और कुछ बहुत ही उपयोगी जवाब यहां हैं:

Checking if a SQL Server login already exists

आशा इस मदद करता है।

-2
USE MyDB 
GO 

BEGIN TRY 
    CREATE USER [foo] FOR LOGIN [foo] 
END TRY 
BEGIN CATCH 
-- User exists - do nothing 
END CATCH 
+1

से पहले "mydb का उपयोग करें" जब तक केवल संभावित त्रुटि यह है कि उपयोगकर्ता पहले ही लॉगिन कर सकता है। – Karlth

+1

downvoted क्योंकि अगर किसी भी अन्य त्रुटि उठाया है, "पासवर्ड नीति" या "अवैध लॉग इन" की तरह, इन त्रुटियों को ट्राई/कैच द्वारा निगल लिया हो जाएगा – Raffaeu

1
USE [*Database_Name*]; 
GO 

DECLARE @isUserExist int, @SQL NVARCHAR(max) 
SELECT @isUserExist = COUNT(*) from sys.sysusers where name = *User_Name* 
--Checking for User Existence 
IF(@isUserExist = 0) 
BEGIN 
    SET @SQL = 'CREATE USER ' + QUOTENAME(*User_Name*) + ' FOR LOGIN ' + QUOTENAME(*User_Name*); 
    EXECUTE(@SQL); 
END 
संबंधित मुद्दे