Essentiellement combinant David's answer et marc_s's answer, tel que demandé par un commentaire de Chris.
Livres en ligne dit de sp_grantdbaccess:
Cette fonctionnalité sera supprimée dans une future version de Microsoft SQL Server. Évitez d'utiliser cette fonctionnalité dans le nouveau travail de développement , et prévoyez de modifier les applications qui utilisent actuellement cette fonctionnalité. Utilisez CREATE USER à la place.
Donc, pour créer seul un utilisateur si l'utilisateur n'existe pas déjà, je ferais quelque chose comme ceci:
/* 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
En dépit d'être dépréciée, sp_grantdbaccess a l'avantage de pouvoir utiliser un paramètre ou une variable locale pour l'utilisateur/nom de connexion, comme dans la réponse de David. La première alternative que je pouvais penser pour obtenir quelque chose de similaire à travailler avec CREATE USER était d'utiliser le SQL dynamique. Par exemple:
assez intéressant
/* 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
, Livres en ligne dit aussi que sp_grantdbaccess
appelle en fait CREATE USER
, et j'ai remarqué dans mes tests que si vous n'attribuez pas explicitement un schéma, sp_grantdbaccess
va créer un nom de l'utilisateur, alors que CREATE USER
utilisera 'dbo' par défaut.
double possible de [Vérification si une connexion SQL Server existe déjà] (http: // stackoverflow.com/questions/1379437/vérification-if-a-sql-server-login-already-exists) – bummi