1

SQL serevr 2012 にユーザーのテーブルがあり、ユーザー テーブルの挿入トリガーから挿入された値を使用して、対応するデータベース ログイン ユーザーを作成したいと考えています。

値をテストして存在することを確認しましたが、挿入されたテーブルで参照された値を適切に使用できないことを除いて、すべてが正常に機能しているようです

ログイン作成手順が変数を受け入れられない可能性はありますか

ALTER TRIGGER [dbo].[addsyslogin] 
   ON [dbo].[Users]
   FOR  INSERT
AS 
BEGIN
    SET NOCOUNT ON;
    SET QUOTED_IDENTIFIER OFF;

    Declare @u varchar(10);
    SELECT @u=i.userid from inserted i;


    print @u;

CREATE LOGIN [@u] WITH PASSWORD='water123GH', DEFAULT_DATABASE=[waterdb], DEFAULT_LANGUAGE=[British], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON


END

quoted_identifiers について調査しましたが、まだこの問題があります。

実際には、@u の値の代わりに userid=@u を使用してデータベース ユーザーが作成されます。

メモとフィードバックをありがとう

4

2 に答える 2

0

これは奇妙なことですが、あなたはする必要があります...

  • 複数の行を許可する
  • 特権をエスカレートする
  • 動的 SQL を使用する

その他の注意事項:

  • エスカレーションに対処するために、トリガーによって呼び出されるマスターに別のストアドプロシージャが必要であることをお勧めします
  • エスカレーションが必要ない場合は、権限が高すぎます

大まかなコード:

ALTER TRIGGER [dbo].[addsyslogin] ON [dbo].[Users] FOR  INSERT
WITH EXECUTE AS --soemthing
AS 
SET NOCOUNT ON;

Declare @u varchar(10), @uid int;

SELECT TOP 1 @uid = i.userid, @u = i.userid
FROM inserted i
ORDER BY i.userid;

WHILE @u IS NOT NULL
BEGIN
    SET @SQL = 'CREATE LOGIN ' + @u+ ' WITH PASSWORD = ''water123GH'', DEFAULT_DATABASE=[waterdb], DEFAULT_LANGUAGE=[British], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON';

    EXECUTE(@SQL);

    SET @u = NULL;

    SELECT TOP 1 @uid = i.userid, @u = i.userid
    FROM inserted i
    WHERE i.userid > @uid
    ORDER BY i.userid;

 END

 GO
于 2012-04-12T10:05:15.743 に答える
0

これを試して:

SET @SQL = 'CREATE LOGIN ' + @u+ ' WITH PASSWORD = ''water123GH'', DEFAULT_DATABASE=[waterdb], DEFAULT_LANGUAGE=[British], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON';
EXECUTE(@SQL);
于 2012-04-12T09:57:57.073 に答える