从最近的帖子(下)中采取下一步

我创建了这个存储过程:

ALTER PROCEDURE dbo.CreateUser
    @loginName nvarchar(100),
    @userName nvarchar(100) ,
    @schemaName nvarchar(10)
AS
    SET NOCOUNT ON;

    IF NOT EXISTS (SELECT [name] FROM [sys].[database_principals] 
                   WHERE [TYPE] = N'S' AND [name] = @loginName)
    BEGIN
        CREATE LOGIN [@loginName] WITH PASSWORD = N'123', DEFAULT_DATABASE = [test], 
                     CHECK_EXPIRATION = OFF, CHECK_POLICY = OFF

        CREATE USER [@userName] FOR login [@loginName]

        GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA :: [dbo] TO [@userName]
        GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA :: [@schemaName] TO [@userName]
END

我像这样调用这个存储过程:

DECLARE @return_value int

EXEC    @return_value = [dbo].[CreateUser]
                        @loginName = N'testlogin1',
                        @userName = N'testUserLogin1',
                        @schemaName = N'itl'

SELECT 'Return Value' = @return_value

但是,这会引发错误:

错误

在调试时,我发现它没有采用参数的值,而是采用文字的值。

如何在此处传递参数值以相应地使用这些值来创建登录、用户和访问权限?

谢谢!

#1楼 票数:2

这里的问题是您正在尝试使用变量来替换文字。 这不是 SQL 的工作方式(它不是脚本语言)。 例如,以下面的语句为例:

CREATE USER [@userName] FOR login [@loginName]

这将创建一个名为@userNameUSER ,它链接到名为@loginNameLOGIN而不是名称为@userNameLOGINUSER ,名称为@loginName

对于这样的事情,您需要使用动态 SQL 并安全地注入您的参数。

ALTER PROCEDURE dbo.CreateUser @loginName sysname, --Changed data type throughout to correct one for objects
                               @userName sysname,
                               @schemaName sysname
AS
BEGIN

    SET NOCOUNT ON;
    IF NOT EXISTS (SELECT [name]
                   FROM [sys].[database_principals]
                   WHERE [type] = N'S'
                     AND [name] = @loginName)
    BEGIN
        DECLARE @SQL nvarchar(MAX),
                @CRLF nchar(2) = NCHAR(13) + NCHAR(10);

        SET @SQL = N'CREATE LOGIN ' + QUOTENAME(@loginName) + @CRLF +
                   N'    WITH PASSWORD = N''123'',' + @CRLF + --I HIGHLY recommend a better password choice...
                   N'         DEFAULT_DATABASE = [test],' + @CRLF +
                   N'         CHECK_EXPIRATION = OFF,' + @CRLF +
                   N'         CHECK_POLICY = OFF;' + @CRLF +
                   N'CREATE USER ' + QUOTENAME(@userName) + N' FOR LOGIN ' + QUOTENAME(@loginName) + N';' + @CRLF +
                   N'GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::[dbo] TO ' + QUOTENAME(@userName) + N';' + @CRLF +
                   N'GRANT SELECT,' + @CRLF +
                   N'      INSERT,' + @CRLF +
                   N'      UPDATE,' + @CRLF +
                   N'      DELETE' + @CRLF +
                   N'    ON SCHEMA::' + QUOTENAME(@schemaName) + @CRLF +
                   N'    TO ' + QUOTENAME(@userName) + N';';

        --PRINT @SQL; --Your debugging friend

        EXEC sys.sp_executesql @SQL;
    END;

END;

  ask by Kgn-web translate from so

未解决问题?本站智能推荐:

1回复

存储过程-使用参数进行选择并填充文本框

我希望我的存储过程从表中选择数据,然后将其放入文本框。 本质上,当某人从下拉菜单中选择一个项目然后想要编辑该项目时,将使用此选项。 我在这里做错了什么? C# 我的存储过程的一部分
1回复

如何在存储过程循环值中传递参数并将结果集转储到临时表中?

如何创建可以将@CandidatelistID作为参数传递给下面现有存储过程逻辑的存储过程。 我的循环CandidateID和CandidateListID并运行一个存储过程usp_ApplyRankingRules循环内得到Weightage为他们每个人。 然后,我想在临时表中加载相同的字段,
1回复

如何将两个值列表传递给SQL Server中的存储过程?

因此,我正在尝试编写一个过程,该过程需要接受两个列表形式的输入值,如下所示: 其中第一个参数是Varchar类型的列表,第二个参数是int类型的列表,并且两个列表的长度相同,第三个参数也是int类型。 我的脚本是使用这两个列表值与第三个参数一起插入到某个表中。 如何存储和迭代
1回复

用于数据访问的 SQL 存储过程

关闭。 此问题不符合Stack Overflow 准则。 它目前不接受答案。
2回复

如何在SQL的新年第一天执行存储过程

我想在新年的第一天执行以下存储过程。
2回复

sql存储过程不起作用(不影响任何行)

试图使该存储过程正常工作。 但它只是返回 Running [team1].[add_testimonial] ( @currentTestimonialDate = 11/11/10, @currentTestimonialContent = this is a test, @cur
1回复

使用自动日期在 SQL 中执行存储过程

有一个软件(称为 StackVision)使用“SQL Server Reporting Services”来创建一些报告。 有关该软件的更多信息,请点击此处。 我试图从数据库中的几个“存储过程”中创建一个新的“视图”。 不过,我不想弄乱存储过程编码。 我只想运行一个代码来根据“存储过程”的结果构
2回复

存储过程:更新

我是存储过程的新手,这是我的问题: 我想创建一个存储过程来更新表“ F_COMPTET”中的行 这是我的代码: 这就是我遇到的问题: 您认为问题是什么?