0

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
4

1 に答える 1

4

だから、私はあなたが言っていることを言い換えさせてください:

  • トリガーを書いた経験がない
  • トリガーを作成した経験のある会社は他に誰もいません
  • 実稼働環境しかなく、コードをテストする場所は他にありません
  • 経営陣は今夜までにこれを成し遂げるようにあなたに言っています

これは確かな災害のレシピです。

まず、失敗するしか選択肢がないという要求に立ち向かう必要があります。適切なテストなしでこのようなことを行うには、データが重要すぎることを経営陣に伝えます。

次に、適切なテスト環境を取得します。会社がMSDNサブスクライバーである場合は、ラップトップまたは一部の仮想マシンにインストールできるSQL Server 2000DeveloperEditionのコピーにアクセスできます。

そのインストールを待っている間、ソフトウェア開発における専門的な振る舞いについて読んでください。http://en.wikipedia.org/wiki/Robert_Cecil_Martinから始めて、ソフトウェアの職人技に進みます。


しかし、それが今夜は起こらないことを私が知っているので、あなたはその間にこれをすることができます:

1)本番サーバーに新しいデータベースを作成します

2)問題のテーブルをコピーします。SELECT TOP(10) * INTO NewDb.dbo.Table FROM OldDb.dbo.Table; これは挿入トリガーであるため、これ以上のデータは必要ありません。

3)同じ方法で必要な他のテーブルをコピーします

4)NewDbのテーブルにトリガーを適用します

5)テスト

6)修正して5に戻ります

7)満足している場合は、トリガーをOldDbにコピーします

考慮すべきいくつかの事柄:

  • 複数の行の挿入をテストするようにしてください
  • トリガーでプロシージャを呼び出さないでください。それ自体が間違っているわけではありませんが、複数行のインサートを使用することはできません。
  • @@IDENTITYは絶対に使用しないでください。それは注文です。(理由と解決策はここにあります:http ://sqlity.net/en/351/identity-crisis/ )

結局、ここでデータベースのTDDを調べ始めます:tSQLt.org (ほとんどのアイデアはSQL 2000で機能しますが、フレームワークは機能しません。)

お役に立てば幸いです。

于 2013-01-08T19:36:11.100 に答える