Получение ошибки с динамическим оператором SQL при попытке создать базу данных, пользователя и логин - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь создать одну хранимую процедуру, которая: 1. Создайте базу данных 2. Создайте логин 3. Создать пользователя 4. Назначьте пользователя для входа 5. Сделать логин SA (роль системного администратора)

Я пытаюсь создать эту хранимую процедуру с 3 параметрами. Первый параметр - это имя для входа. Второй параметр - это имя пользователя. Третий параметр - это пароль для входа в систему. (Имя базы данных совпадает с именем пользователя) Когда у меня есть только два параметра: пользователь и пароль (с именем базы данных и именем входа, совпадающим с именем пользователя), он работает без ошибок.

USE []
GO
/****** Object:  StoredProcedure [dbo].[spCreateDatabases]    Script Date: 11/8/2018 1:54:09 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[spCreateDatabaseWithSAUserAndLoginx]
    @userID varchar(50),
    @password varchar(10)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @newdb sysname
    DECLARE @SQL NVARCHAR(4000)
    SET @newdb = @userID
    PRINT @UserID
    EXEC('CREATE DATABASE ' + @newdb)
END
BEGIN
    -- Create the user name
    SET @SQL = 'USE ' + @newdb + ';' + 'CREATE LOGIN ' + @userID + ' WITH PASSWORD = ''' + @password + '''; ' + 
    'CREATE USER ' + @userID + ' FOR LOGIN ' + @userID + '; ' + 'ALTER SERVER ROLE sysadmin ADD MEMBER ' + @userID + ';'         
    EXECUTE(@SQL);
END

Однако, когда я добавляю новый параметр, он выдает мне сообщение об ошибке: «Невозможно добавить принципала сервера», потому что он не существует или у вас нет разрешения.

USE []
GO
/****** Object:  StoredProcedure [dbo].[spCreateDatabases]    Script Date: 11/8/2018 1:54:09 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[spCreateDatabaseWithSAUserAndLoginx]
    @userID varchar(50),
    @login varchar (50),
    @password varchar(10)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @newdb sysname
    DECLARE @SQL NVARCHAR(4000)
    SET @newdb = @userID
    EXEC('CREATE DATABASE ' + @newdb)
END
BEGIN
    -- Create the user name
    SET @SQL = 'USE ' + @newdb + ';' + 'CREATE LOGIN ' + @login + ' WITH PASSWORD = ''' + @password + '''; ' + 
    'CREATE USER ' + @userID + ' FOR LOGIN ' + @login + '; ' + 'ALTER SERVER ROLE sysadmin ADD MEMBER ' + @userID + ';'         
    EXECUTE(@SQL);
END

1 Ответ

0 голосов
/ 08 ноября 2018

Для ALTER SERVER ROLE xxx ADD MEMBER используйте @login вместо @ userid

...

ADD MEMBER server_principal Добавляет указанный принципал сервера в роль сервера.server_principal может быть именем входа или пользовательской ролью сервера.server_principal не может быть фиксированной серверной ролью, ролью базы данных или sa.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...