2017-01-06 5 views
0

SQLデータベースでこの削除トリガーを使用しています。レコードは現在削除され、監査テーブルに書き込まれます。この履歴テーブルに、SurveyIDに基づいて削除されるレコードに関連する別のテーブルのフィールドを含めるように求められました。トリガーを削除して別のテーブルからフィールドを取得する

select @Status = Status from table where Survey = deleted.Survey 

これは誤った構文です。

ALTER trigger [dbo].[table_Selfdelete] 
on [dbo].[table] 

after delete 
as 
Begin 
Set nocount on; 

Declare @SurveyId int 
Declare @StudentUIC varchar(10) 
Declare @Status varchar(10) 

select @SurveyId = deleted.SurveyID, 
     @StudentUIC = deleted.StudentUIC 
from deleted 

select @Status = Status from tbly when SurveyID = deleted.SurveyID 

insert into fupSurveyAudit 
    values(@SurveyId,@StudentUIC,@Status) 


End  
+0

複数の行を削除するとどうなりますか? – DVT

+2

これまでに投稿された3つの回答は、DVTが指摘している重要な点を強調していませんが、すべて修正しています。 *文*ごとに1回トリガされるので、 'deleted'には0,1または* multiple *の行が含まれます。スカラー変数に 'deleted 'の値を代入するのは、あなたがここで行うように、他の行を無視する*ため、常に間違いです。 –

答えて

1

Arrghを試してみてください....このような監査テーブル何かに削除されたテーブルから簡単な挿入を必要としています。それが実行につながる可能性の行を持っていると仮定して、

  • deletedが複数の行を含めることができます:

    insert into fupSurveyAudit(SurveyId, StudentUIC, status) 
        select d.SurveyId, d.StudentUIC, y.status 
        from deleted d left join 
         tbly y 
         on d.SurveyId = y.SurveyId; 
    

    注:私はあなたのトリガー(何もない)でこのinsertをしたいと思います時間エラーまたは不正確な結果。

  • ステータスに一致する行がない場合は、left joinが必要です。
  • あなたは常にあなたのアーカイブテーブルは、このようなID列と自動的に設定(したがって、インサートのない明示的に一部)され、インサートの日付などの追加の列を、持っている必要がありinsert
  • の列を含める必要があります。
0

トリガーは、ステートメント内の各行ではなく、ステートメント(削除、挿入、更新)ごとに1回起動されます。

ここで変数を使用することはできません。なぜなら、変数が1つの値しか保持できないため、1行だけが監査テーブルに挿入されるからです。

あなただけ

ALTER trigger [dbo].[table_Selfdelete] 
on [dbo].[table] 

after delete 
as 
Begin 
Set nocount on; 

insert into fupSurveyAudit(SurveyId, StudentUIC,[Status]) 
select d.SurveyID 
     ,d.StudentUIC 
     ,y.[Status] 
from deleted d 
INNER JOIN tbly y ON y.SurveyID = deleted.SurveyID 

End 
0

この

ALTER trigger [dbo].[table_Selfdelete] 
on [dbo].[table] 

after delete 
as 
Begin 
Set nocount on; 

insert into fupSurveyAudit -- Better listed the column list here 
select 
    d.SurveyID, d.StudentUIC, y.Status 
from 
    deleted d JOIN tbly y ON d.SurveyID = y.SurveyID 

End  
関連する問題