sostanza che unisce David's answer e marc_s's answer, come richiesto da un commento di Chris.
documentazione in linea dice di sp_grantdbaccess:
Questa funzionalità verrà rimossa in una versione futura di Microsoft SQL Server . Evitare di utilizzare questa funzione nel nuovo lavoro di sviluppo e pianificare modificare le applicazioni che attualmente utilizzano questa funzionalità. Utilizzare invece CREATE USER.
Quindi solo a creare un utente se l'utente non esiste già, mi piacerebbe fare qualcosa di simile:
/* 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
Nonostante sia deprecato, sp_grantdbaccess ha il vantaggio di essere in grado di utilizzare un parametro o una variabile locale per il nome utente/login, come nella risposta di David. La prima alternativa che potevo pensare per ottenere qualcosa di simile a lavorare con CREATE USER era usare SQL dinamico. Per esempio:
/* 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
Abbastanza interessante, documentazione in linea dice anche che in realtà chiama sp_grantdbaccess
CREATE USER
, e ho notato nel mio test che, se non si assegna in modo esplicito uno schema, sp_grantdbaccess
creerà uno chiamato dopo che l'utente, mentre CREATE USER
utilizzerà 'dbo' per impostazione predefinita.
possibile duplicato del [Verificando un account di accesso di SQL Server esiste già] (http: // StackOverflow.it/questions/1379437/check-if-a-sql-server-login-already-exists) – bummi