7

私は開発者で、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 マネージャーのエラーが私にはわかりにくい場合は、助けを求める方が良いでしょう :)

ありがとう、ジャスティン

4

4 に答える 4

11

どうやら CREATE LOGIN はリテラルのみを受け入れます。これを exec でラップして、文字列としてビルドしてみることができます。

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

編集:SQLインジェクション攻撃からの安全のためにquotenameを追加

于 2009-05-07T22:25:04.510 に答える
6

考えられる解決策:

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

于 2009-05-08T07:51:37.410 に答える
1

これを試して:

declare @t nvarchar(4000)
set @t = N'CREATE LOGIN ''''' + @username + ''''' WITH PASSWORD = ''''' + @password
exec sys.sp_executesql @t
于 2009-05-07T22:28:38.870 に答える