3

ユーザーがテーブルにデータを挿入すると、テーブルのフィールド内の特定の文字を更新するデータベース トリガーを作成しようとしています。

ID  EXCHANGE   LEADRT
1    new         L-3
2    new         3
3    new         5

LEADRT の形式は正しいが、id 2 と 3 は正しくないため、id 1 はそのままにしておきます。

CREATE TRIGGER triggerupdate ON PoleUnits FOR INSERT, 
UPDATE AS 
if not exists (select * from Poleunits where LEADRT like '%L-%') 
update PoleUnits set LEADRT = STUFF (LEADRT, 1, 0,'L-');  

これを機能させることができない理由や、これを達成する方法に関するより良い提案はありますか?

4

1 に答える 1

3

inserted挿入トリガーと更新トリガーでは、挿入/更新する行が保持されている特定のテーブルにアクセスできます。これらは実際のテーブルではなく、トリガーが起動されたテーブルと同じ構造を持つ単なる論理テーブルです。

現在のロジックは元のテーブルで機能するため、既存のすべてのデータを操作しますが、実際に挿入するデータは操作しません。つまり、実際に更新したいデータを除いてすべてを更新します。このようなものはうまくいくかもしれません:

CREATE TRIGGER triggerupdate ON PoleUnits 
FOR INSERT, UPDATE AS 
  update PoleUnits
  set LEADRT = STUFF (PoleUnits.LEADRT, 1, 0,'L-')
  from PoleUnits 
    inner join inserted  -- this is basically a self join
      on PoleUnits.ID = inserted.ID
  where PoleUnits.LEADRT not like '%L-%'

これは、挿入されている PoleUnits の行のみを更新し、それらの LEADRT フィールドが L- 形式でない場合にのみ更新します。

于 2012-12-21T20:56:14.963 に答える