Как предоставить пользователю доступ к БД изнутри хранимой процедуры в SQL Ошибка при получении на сервере: оператор процедуры USE не разрешен в процедуре - PullRequest
0 голосов
/ 04 февраля 2020

Мне нужно предоставить пользователю доступ к базе данных изнутри хранимой процедуры на SQL Сервере, но когда я пытаюсь использовать этот код, используемая БД не меняется, и когда я запускаю код без использования EXEC, Я получаю сообщение об ошибке:

Использование оператора базы данных не разрешено в процедуре

Мой код:

CREATE PROCEDURE [dbo].[usp_AddUserDBToTables] 
    (@UserGroup NCHAR(30),    -- DBdetail, DBxref
     @DBName NCHAR(30))       -- DBdetail, DBxref
AS
BEGIN
    DECLARE @sqlcmd NVARCHAR(1024);

    -- Add the UserGroup to the new UserDB
    SET @sqlcmd = 'USE [' + rtrim(ltrim(@DBName)) + ']'

    PRINT (@sqlcmd)

    EXEC (@sqlcmd)

    PRINT 'now using ' + db_name()

    SET @sqlcmd = 'CREATE USER [' + rtrim(ltrim(@UserGroup)) + '] FOR LOGIN [' + rtrim(ltrim(@UserGroup)) + ']'

    PRINT (@sqlcmd)

    EXEC (@sqlcmd)

    SET @sqlcmd = 'ALTER ROLE [db_owner] ADD MEMBER [' + rtrim(ltrim(@UserGroup)) + ']'

    PRINT (@sqlcmd)

    EXEC (@sqlcmd)

    SET @sqlcmd = 'USE [HOSTED_SUPPORT]'

    PRINT (@sqlcmd)

    EXEC (@sqlcmd)
END

Группа пользователей: добавлено в HOSTED_SUPPORT, а не в @DBName. Операторы печати сгенерировали это, но я не получил ошибок при использовании Dynami c SQL:

USE [ZU_1077a]
now usingZMIT_HOSTED_SUPPORT
CREATE USER [ZMCLIENT\1007 FirstBank] FOR LOGIN [ZMCLIENT\1007 FirstBank]
ALTER ROLE [db_owner] ADD MEMBER [ZMCLIENT\1007 FirstBank]
USE [ZMIT_HOSTED_SUPPORT]

Как я могу сделать эту работу изнутри хранимой процедуры?

1 Ответ

1 голос
/ 04 февраля 2020

Вам нужно поместить всю команду в одну динамику c SQL и запустить ее, потому что USE DATABASE выйдет из строя, когда будет выполнена первая динамическая переменная c SQL, содержащая команду USE.

Итак, удалите все EXE C, кроме последнего, и объедините все SQL в @sqlcmd. Запустите EXE C the @ sqlcmd.

...