Задача: проверить, есть ли на сервере соответствующий серверный логин, роль на уровне базы данных, пользователь на уровне базы данных и создать в случае отсуствия. Решение приводится для MS SQL Server 2005 и выше.
Существование серверного логина
declare @user_name_db varchar(50), @password varchar(30), @sql_statement nvarchar(1000), @error_message varchar(1000) set @user_name_db = 'a.s.pushkin' set @password = 'pamyatnik'
if not exists (select name from sys.server_principals where type = 'S' and name = @user_name_db) begin select @sql_statement = 'CREATE LOGIN "' + @user_name_db + '" WITH PASSWORD = ''' + @password+ ''', CHECK_POLICY = OFF' exec sp_executesql @sql_statement end
Существование роли в текущей базе данных
if database_principal_id('db_executor') is null begin create role db_executor grant execute to db_executor end
Существование пользователя в текущей базе данных
if (select count(*) from sys.database_principals where name = @user_name_db) = 0 begin -- создаем пользователя select @sql_statement = 'CREATE USER "' + @user_name_db + '" FOR LOGIN "' + @user_name_db+ '"' exec sp_executesql @sql_statement -- прописываем права EXEC sp_addrolemember db_executor, @user_name_db EXEC sp_addrolemember db_datareader, @user_name_db EXEC sp_addrolemember db_datawriter, @user_name_db end else begin set @error_message = 'Пользователь ' + @user_name_db + ' уже существует! ' RAISERROR (@error_message, 14, 1) end
sp_executesql (Transact-SQL)
sys.server_principals (Transact-SQL)
Mapping SQL Server 2000 System Tables to SQL Server 2005 System Views
DATABASE_PRINCIPAL_ID (Transact-SQL)