По сути, объединяет ответ Дэвида и ответ marc_s , как было запрошено в комментарии от Криса.
Books Online говорит о sp_grantdbaccess :
Эта функция будет удалена в
будущая версия Microsoft SQL
Сервер. Избегайте использования этой функции в
новые разработки и планируют
изменить приложения, которые в настоящее время используют
эта особенность. Вместо этого используйте 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
Интересно, что Books Online также говорит, что sp_grantdbaccess
на самом деле вызывает CREATE USER
, и я заметил в своем тестировании, что если вы не назначите схему явно, sp_grantdbaccess
создаст одну из имен пользователя, а CREATE USER
будет использовать 'dbo' по умолчанию.