Zasadniczo połączenie David's answer i marc_s's answer, zgodnie z wnioskiem z komentarzem Chrisa.
Books Online mówi sp_grantdbaccess:
Ta funkcja zostanie usunięta w przyszłej wersji programu Microsoft SQL Server . Unikaj korzystania z tej funkcji w nowych pracach rozwojowych i planuj, aby modyfikować aplikacje, które obecnie używają tej funkcji. Zamiast tego użyj CREATE USER.
Tak, aby utworzyć użytkownika tylko wtedy, gdy użytkownik nie istnieje, chciałbym zrobić coś takiego:
/* 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
Pomimo przestarzałe, sp_grantdbaccess ma tę zaletę, że jest w stanie wykorzystać parametr lub zmienna lokalna dla nazwy użytkownika/loginu, tak jak w odpowiedzi Dawida. Pierwszą alternatywą, którą mogłem wymyślić, aby uzyskać coś podobnego do pracy z CREATE USER, było użycie dynamicznego SQL. Na przykład:
/* 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
Co ciekawe, Books Online mówi również, że sp_grantdbaccess
faktycznie nazywa CREATE USER
i zauważyłem w moim testowania, że jeśli nie jawnie przypisać schematu sp_grantdbaccess
stworzy jeden nazwany użytkownik, podczas gdy CREATE USER
domyślnie użyje "dbo".
możliwe duplikat [Sprawdzenie czy logowania SQL Server już istnieje] (http: // stackoverflow.com/questions/1379437/checking-if-a-sql-server-login-already-exists) – bummi