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

Jus*_*tin 4 sql stored-procedures login saas

我是开发人员而且我很厌烦SQL :)请帮帮我.

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

我只是在尝试创建Login时感到困惑.这是我试过的......

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
Run Code Online (Sandbox Code Playgroud)

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

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

我意识到这应该是直截了当的,但是当你的新SQL和SQL管理器错误就像他们似乎对我来说一样神秘时,最好只是寻求帮助:)

谢谢,贾斯汀

cod*_*ike 9

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

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

编辑:为sql注入攻击的安全性添加了引号

  • `quotename`至少存在于SQL Server 2000,https://msdn.microsoft.com/en-us/windowsserver/aa238369.问题,在SQL Server 2014中仍然如此,你不能在`EXEC(...)`中调用一个函数.您只能连接字符串文字和字符串函数. (3认同)
  • `Msg 102,Level 15,State 1,Line 4'quot'ame'附近的语法不正确 (2认同)

Gal*_*kin 5

可行的解决方案:

sp_addlogin @loginame = 'test', @passwd = 'test', @defdb = 'test'