3

MSSQL Server 2008R2 にトリガーがあります。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[trg_HosFile_Delete] 
    ON [dbo].[hosfile] FOR DELETE 
AS 
    insert into #pys(pyGuid)
    SELECT EntryGuid AS pyGuid FROM er000 AS er

    insert into t2(C1) select pyGuid from #pys

トリガーが実行された後、t2テーブルは空です。なぜそれは空ですか?

上記のクエリをトリガーなしで実行すると、t2テーブルがいっぱいになります。

トリガーで一時テーブルを使用することに問題はありますか?

4

4 に答える 4

3

トリガーの起動時に一時テーブルがスコープ内にあれば、一時テーブルを使用しても問題はありません。

トリガーが任意の接続でいつでも起動できることを考えると、意味のある唯一のスコープはトリガーの本体内です。

ALTER TRIGGER [dbo].[trg_HosFile_Delete] 
    ON [dbo].[hosfile] FOR DELETE 
AS 
    CREATE TABLE #pys (pyGuid uniqueidentifier not null/*I'm guessing*/)

    insert into #pys(pyGuid)
    SELECT EntryGuid AS pyGuid FROM er000 AS er

    insert into t2(C1) select pyGuid from #pys

(正直に言うと、外部スコープから一時テーブルにアクセスできるかどうかはわかりませんが、それをテストするのに便利なインスタンスがありません。しかし、できたとしても、非常に脆弱なトリガーになります)

于 2012-11-14T15:47:40.260 に答える
0

##pys を使用すると (二重の # 記号に注意してください)、作成後にグローバルに使用できるようになります。それはあなたの場合に役立つかもしれません。

于 2013-05-22T16:05:36.877 に答える
0

SELECT INTO を使用して、一時テーブルを作成および設定してみてください。トリガー内で一時テーブルを使用する場合、いくつかの制限があります。

于 2014-12-15T12:37:08.413 に答える