2012-04-12 7 views
1

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

が存在することを確認するために値をテストしているものの

すべては、それが作成し、ログイン手順は変数を受け入れることができない可能性があり、私が正しく挿入テーブル で参照値を使用することはできませんことを除いて、[OK]を動作するようです

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を使用して実際に作成されます。

あなたのノートをありがとうとフィードバック

+2

はMUST手をトリガle複数の行 –

+0

2人のユーザーを挿入すると、トリガーは1回だけ起動しますが、挿入されたテーブルには2つの行が含まれます。あなたのコードはこれを期待していません。 – Andrew

+1

ところで、あなたは、CREATE LOGINステートメントでそのようなパラメータを使用することはできません... –

答えて

0

はこれを試してみてください。

SET @SQL = 'CREATE LOGIN ' + @u+ ' WITH PASSWORD = ''water123GH'', DEFAULT_DATABASE=[waterdb], DEFAULT_LANGUAGE=[British], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON'; 
EXECUTE(@SQL); 
+1

トリガで動的SQL!あなたはTSQL地獄に行くのです! –

+1

awwですが、 "drop database water":p –

+0

のようにsqlパラメータを指定してuseridを作成しましたが、これで問題は解決します。私はトリガでログインすることは決してしませんが、彼の現実​​はわかりません。おそらく、彼の唯一の可能性は、いくつかの不気味な理由があります。 – Diego

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 
+0

ありがとう、私は感謝しています – user1328709

関連する問題