Sql server 如何授予用户从SQL Server存储过程内部访问数据库的权限-获取错误:过程中不允许使用数据库语句

Sql server 如何授予用户从SQL Server存储过程内部访问数据库的权限-获取错误:过程中不允许使用数据库语句,sql-server,stored-procedures,Sql Server,Stored Procedures,我需要授予用户从SQL Server中的存储过程内部访问数据库的权限,但当我尝试使用此代码时,使用中的数据库不会更改,并且当我在不使用EXEC的情况下运行代码时,会出现错误: 过程中不允许使用数据库语句 我的代码: CREATE PROCEDURE [dbo].[usp_AddUserDBToTables] (@UserGroup NCHAR(30), -- DBdetail, DBxref @DBName NCHAR(30)) -- DBdetail, D

我需要授予用户从SQL Server中的存储过程内部访问数据库的权限,但当我尝试使用此代码时,使用中的数据库不会更改,并且当我在不使用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
用户组被添加到托管的_支持中,而不是@DBName。Print语句生成了此结果,但在使用动态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]

如何从存储过程内部执行此操作?

您需要将所有命令放在一个动态SQL中并运行它,因为当执行包含USE命令的第一个动态SQL时,USE数据库将失效


因此,除去最后一个EXEC之外的所有EXEC,并在@sqlcmd中包含所有SQL。运行EXEC the@sqlcmd.

有什么原因需要在这里进行动态查询吗?太棒了!谢谢你@PeterHe!