SQLServer2000で挿入のトリガーを作成するように言われました。
私はこれまでトリガーを作成したことがなく、古いサーバーにはトリガーが定義されていないようです。
SQL Serverチュートリアルのトリガーに従って、まだ実行していないこのトリガーを作成しました。
create trigger trgAfterMachine1Insert on Test_Results
after insert
as
declare @sn varchar(20), @sysID varchar(50),
@opID varchar(50), @testResult varchar(255)
select @sn=Serial_Number from inserted
select @sysID=System_ID from inserted
select @opID=Op_ID from inserted
select @testResult=Test_Result from inserted
exec sp1_AddSnRecord(@sn, @sysID, @opID, @testResult)
print 'Machine1 After Insert Trigger called AddSnRecord'
go
まず、sp1_AddSnRecord
このデータを新しいテーブルに挿入するために呼び出されるストアドプロシージャを作成したことに注意してください(したがって、既存のテーブルを台無しにしないでください)。ストアドプロシージャは、他のテーブルに何かを挿入する前にデータの検証と列挙を実行するため、トリガーで呼び出すことができることを願っています。
SQL Server 2000で、これが機能するかどうかをテストする方法が実際にはわかりません。また、ManagementStudioの[実行]ボタンを押すだけで少し緊張します。
それで、私はこれをしばらく見ていて、他のいくつかのSOテクニックを読み上げようとしています。
Aaron Bertrandのここの例から、選択したすべての呼び出しを1行にまとめることができるように見えます。
create trigger trgAfterMachine1Insert on Test_Results
after insert
as
declare @sn varchar(20), @sysID varchar(50),
@opID varchar(50), @testResult varchar(255)
select @sn=Serial_Number, @sysID=System_ID,
@opID=Op_ID, @testResult=Test_Result
from inserted
exec sp1_AddSnRecord(@sn, @sysID, @opID, @testResult)
print 'Machine1 After Insert Trigger called AddSnRecord'
go
そうでなければ、私はどこにもこれ以上啓発的なものを見たり、トリガーを作成する前にトリガーをテストするためのテクニックについて尋ねる人を見たりしません。
ここで働いている私の大学の1つは、私よりも多くのSQL作業を行っていますが、彼はトリガーを作成したことがないことを認めています。彼が私に言うことができたのは、「男、それを台無しにすると、サーバー上で多くの問題を引き起こす可能性がある!」ということだけでした。緊張しただけだったので、ここにいます。(私がしていることの98%は、Windowsフォームと古いWindowsモバイルデバイス用のC#コードを書くことです)。
では、このトリガーが有効であり、作成する前にサーバーで問題が発生しないことを確認するにはどうすればよいですか?自分のマシンにローカルのSQLServerExpressがありますが、SQL 2000よりもはるかに新しく、本番フロアからライブデータが実行されていません。
後でトリガーに障害があることが判明した場合、簡単な方法でトリガーを削除できdelete trigger trgAfterMachine1Insert
ますか?「トリガーの削除」を検索すると、ほとんどの場合、のトリガーが返されているようですAFTER DELETE
。
前もって感謝します。
更新: Martinの要求に応じてストアドプロシージャを含める:
ALTER PROCEDURE [dbo].[sp1_AddSnRecord](
@serial_Number varchar(20),
@system_ID varchar(50),
@op_ID varchar(50),
@test_Result varchar(255)) as begin
set NOCOUNT ON;
declare @sn as VarChar(20);
set @sn=dbo.fn_ValidSN(@serial_Number);
if (7<Len(@sn)) begin
declare @badge varchar(50), @result varchar(50), @sysID varchar(50);
set @badge=dbo.fn_GetBadge(@op_ID);
set @result=dbo.fn_GetTestResult(@test_Result);
set @sysID=dbo.fn_GetSysType(@system_ID);
if ((0<Len(@badge)) and (0<Len(@result)) and (0<Len(@sysID))) begin
declare @id int;
select @id=ID from Serial_Numbers where Serial_Number=@sn;
if (@id<1) begin -- this serial number has not been entered
insert into Serial_Numbers (Serial_Number) values (@sn);
select @id=@@IDENTITY from Serial_Numbers;
end
if (0<@id) begin -- now insert into SN_Records
insert into SN_Records (SN_ID, SYS_ID, OP_ID, Date_Time, Test_Result)
values (@id, @sysID, @badge, GetDate(), @result);
end
end
end
end