David's answer существу объединение и marc_s's answer по просьбе комментарий от Криса.
Книги Интернет говорит sp_grantdbaccess:
Эта функция будет удалена в будущей версии Microsoft SQL Server. Избегайте использования этой функции в новых разработках и планируйте до изменять приложения, которые в настоящее время используют эту функцию. Вместо этого используйте CREATE USER.
Так только создать пользователя, если пользователь не существует, я бы что-то вроде этого:
/* 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, было использование динамического SQL. Например:
/* 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 Server уже существует] (HTTP: // StackOverflow.com/questions/1379437/check-if-a-sql-server-login-уже существует) – bummi