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