Udai Karan Mathur Ответов: 1

Не удалось создать пользователя в базе данных SQL server


Привет,

Я хочу создать базу данных с помощью скрипта и в то же время хочу создать пользователя внутри этой базы данных. Для этого я создал ниже приведенную хранимую процедуру.
----Procedure Start----

CREATE PROCEDURE [dbo].[USP_CreateDatabase]     
(       
    @DatabaseName nvarchar(100),  
    @UserName nvarchar(100),
    @DBPassword nvarchar(100) 
)   
as 
/*   
exec USP_CreateDatabase 'ST_Test','client','client@123' 
*/  
BEGIN                        
    
    SET NOCOUNT ON; 

    DECLARE @scriptfirst nvarchar(max);

    IF NOT EXISTS(SELECT name FROM master.dbo.sysdatabases WHERE  name LIKE '%'+ @DatabaseName +'%')
    BEGIN
        SET @scriptfirst = N' use [master];' +char(13)+char(10)+ 
        ' Create database ['+ @DatabaseName +'];' +char(13)+char(10);

        EXEC sp_executesql @scriptfirst;

        --select @scriptfirst;
    END     

    IF NOT EXISTS(SELECT dp.name FROM sys.server_principals sp LEFT JOIN sys.database_principals dp ON sp.sid = dp.sid
    WHERE dp.name LIKE '%'+ @UserName +'%' and sp.default_database_name LIKE '%'+ @DatabaseName +'%')
    BEGIN
        SET @scriptfirst = N' use ['+ @DatabaseName +'];' +char(13)+char(10)+ 
        ' SET ANSI_NULLS ON;' +char(13)+char(10)+ 
        ' SET QUOTED_IDENTIFIER ON;' +char(13)+char(10)+ 
        ' CREATE USER [' + @UserName + '] FOR LOGIN [' + @UserName + '] WITH DEFAULT_SCHEMA=[dbo];' +char(13)+char(10)+ 
        ' ALTER ROLE [db_owner] ADD MEMBER [' + @UserName + '];' +char(13)+char(10);

        EXEC sp_executesql @scriptfirst;

        --select @scriptfirst;
    END 
END
GO

----Procedure End----
Эта процедура прекрасно работает, когда я бегу с пользователем 'sa' (sysadmin).
На производстве у нас не было прав " sa " (сисадмина). Они предоставляют нам логин, который имеет роли сервера "public" и "dbcreator". Теперь, когда я запустил хранимую процедуру с правами dbcreator, она создает базу данных, но не создает пользователя.

Это дает мне ошибку:
Цитата:
Msg 15063, Уровень 16, Состояние 1, Строка 4
У входа в систему уже есть учетная запись под другим именем пользователя.
Msg 15151, Уровень 16, Состояние 1, Строка 5
Невозможно добавить основного "клиента", потому что он не существует или у вас нет разрешения.

Я проверил эту проблему и обнаружил, что она прикрепила вновь созданную базу данных к пользователю "dbo". Мое требование состоит в том, чтобы создать базу данных и создать пользователя "клиент" внутри вновь созданной базы данных, а не пользователя "dbo".

Примечание: на производстве мы будем иметь логин только с правами "dbcreator".
Пожалуйста, дайте мне знать, как можно этого добиться ?

Что я уже пробовал:

Я попробовал несколько вещей:

1) изменил режим базы данных с многопользовательским, но это не сработало.

2) пробовал менять новоиспеченного владельца базы данных 'СА'.
EXEC sp_changedbowner 'sa'; 
Но из-за проблемы с правами это дает мне ошибку:
Цитата:
Msg 15151, Уровень 16, Состояние 1, Строка 1
Не можете найти принципала "СА", потому что он не существует или у вас нет разрешения.

Herman<T>.Instance

Чтобы создать нового пользователя, сначала создайте логин, а затем самого пользователя.

1 Ответов

Рейтинг:
2

telliott24

Это невозможно только с ролью dbcreator. Вам нужно изменить любое разрешение пользователя.


Udai Karan Mathur

Привет,
Спасибо за ваш ответ. Я дал свой логин "клиент" всем ролям сервера, кроме "сисадмина", но тогда тоже существует такая же проблема. Она создает базу данных с пользователем dbo' пользователь не "клиент".

Пожалуйста, дайте мне знать, какую роль / разрешение я упускаю.