SQL CREATE LOGON - 不能使用@parameter 作为用户名

Posted

技术标签:

【中文标题】SQL CREATE LOGON - 不能使用@parameter 作为用户名【英文标题】:SQL CREATE LOGON - can't use @parameter as username 【发布时间】:2010-10-24 15:42:14 【问题描述】:

我是一名开发人员,我的 SQL 很烂:) 请在这里帮帮我。

我想创建自己的存储过程,在我的 SaaS 数据库中创建租户。为此,我需要为租户创建一个新的 SQL 登录名,然后将其添加到预定义的 SQL 角色中。

我已经为尝试创建登录感到难过。这是我尝试过的...

CREATE PROCEDURE [MyScheme].[Tenants_InsertTenant]
    @username nvarchar(2048),
    @password nvarchar(2048)

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    CREATE LOGIN @username WITH PASSWORD = @password
END

消息 102,级别 15,状态 1,过程 Tenants_InsertTenant,第 16 行 '@username' 附近的语法不正确。

消息 319,级别 15,状态 1,过程 Tenants_InsertTenant,第 16 行 关键字“with”附近的语法不正确。如果此语句是公用表表达式、xmlnamespaces 子句或更改跟踪上下文子句,则前面的语句必须以分号结束。

我意识到这应该是直截了当的,但是当您的 SQL 新手和 SQL 管理器错误对我来说似乎很神秘时,最好寻求帮助:)

谢谢, 贾斯汀

【问题讨论】:

【参考方案1】:

基于@codeulike 和@Galkin 的答案,我最终做到了:

DECLARE @t nvarchar(4000)
SET @t = N'CREATE LOGIN ' + QUOTENAME(@username) + ' WITH PASSWORD = ' + QUOTENAME(@password, '''') + ', default_database = ' + QUOTENAME(@DatabaseName)
EXEC(@t)

我正在运行 SQL Server 2019 并将 EXEC(--> 与 QUOTENAME() 内

如果我理解 microsoft sql injection documentation 使用引号来构建字符串,那么执行可以保护您免受 SQL 注入。

【讨论】:

【参考方案2】:

显然 CREATE LOGIN 只接受文字。 您可以尝试将其包装在 exec 中并将其构建为字符串:

EXEC('CREATE LOGIN ' + quotename(@username) + ' WITH PASSWORD = ' + quotename(@password, ''''))

编辑:添加引号以防止 sql 注入攻击

【讨论】:

感谢您的快速响应。这似乎有效。是否比使用 EXEC sp_addlogin @username, @password 从我读到的 sp_addlogin 已弃用更好。 我不知道它是否比 sp_addlogin 更好,但你说得对,sp_addlogin 已被弃用。从对话here 看来,在微软开始参数化 CREATE LOGIN 命令之前,Exec() 是唯一的官方方法。 Msg 102, Level 15, State 1, Line 4 Incorrect syntax near 'quotename'. @Shannon Quotename() 仅支持 Sql2008 以上,这可能是您遇到的问题? quotename 至少从 SQL Server 2000 开始就存在,msdn.microsoft.com/en-us/windowsserver/aa238369。问题是,在 SQL Server 2014 中仍然存在,您不能在 EXEC(...) 中调用函数。您只能连接字符串文字和字符串函数。【参考方案3】:

可能的解决方案:

sp_addlogin @loginame = '测试',@passwd = '测试',@defdb = '测试'

【讨论】:

sp_addlogin 已弃用,取而代之的是 CREATE LOGIN,唉 (msdn.microsoft.com/en-us/library/ms173768.aspx)【参考方案4】:

试试这个:

declare @t nvarchar(4000)
set @t = N'CREATE LOGIN ''''' + @username + ''''' WITH PASSWORD = ''''' + @password
exec sys.sp_executesql @t

【讨论】:

以上是关于SQL CREATE LOGON - 不能使用@parameter 作为用户名的主要内容,如果未能解决你的问题,请参考以下文章

lua_src_error display.new Sprite() - create sprite failure,source "Logon/logon_logo.png" 错

SQL知识总结

“用户'NT AUTHORITY ANONYMOUS LOGON'登录失败。”到SQL Server 2005

从其他SQL Server连接时,用户'NT AUTHORITY ANONYMOUS LOGON'登录失败

SQL server 用命令行更改数据库

变量“sql_mode”不能设置为“NO_AUTO_CREATE_USER”的值