• ベストアンサー

SQL Server INSERTのトリガで採番

データINSERT時にトリガを使い主キーを 採番したいのですが、少々コーディングに 困っていてます。 わかる方どうぞ、助言をお願いします。 主キー yyyymm+n(5) 採番したまではよかったのですが、 INSTEADテーブル(トリガのバッファテーブル?)の 主キーのフィールドに 格納する方法がわかりません。 どうもORACLEと記述方法がまるで違うので かなり苦戦しています。 テーブルが確定してるので現状の フィールドレイアウトやデータ体系を変更することは できません。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Euglena
  • ベストアンサー率62% (5/8)
回答No.3

> その方法だと 何らかの対策をしないと > トリガーが再起されませんか? INSERTトリガは対象テーブルのレコード追加で実行されるので、 UPDATEでは実行されません。 (UPDATEトリガ内でINSERT処理があれば別ですが・・) 「危険」といったのは、 「同一主キーのレコードが複数ある可能性は?」 と思ったからです。 INSERT処理で主キーにレコードを特定できる値を 入れているならば問題はないと思います。

Hk2001
質問者

お礼

データ展開処理もトリガで 実行していたのですが トランザクションの単位の関係上 トリガ処理をやめました。 ちなみにプログラムからの単体処理は、成功しました いろいろご回答ありがとうございました。

Hk2001
質問者

補足

なるほど、了解しました。 ところでSQL SERVERは行トリガって 使えないのでしょうか? INSERT文を一行ずつで発行した場合は、 問題ないと思いますが、 INSERT INTO SELECT を使用した場合など問題になりそうですね あと、トリガは、一応できました。 これからプログラムからうまく通れば解決です。 ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

「inserted」テーブルは、その名の通りinsert「された」行を保持しているのであって、これからinsertする行を保持しているのではありません。また、変更はできません。 どうしてもトリガで処理するのであれば、主キーを特別な値(例えばALL0とか)でINSERTし、トリガ内でそれを採番したものに書き換える update tbl set pk=saiban from inserted where tbl.pk=inserted.pk とかすればできなくはないように思いますが...

Hk2001
質問者

お礼

データ展開処理もトリガで 実行していたのですが トランザクションの単位の関係上 トリガ処理をやめました。 ちなみにプログラムからの単体処理は、成功しました ご回答ありがとうございました。

Hk2001
質問者

補足

そんな気がしてたのですが とにかく一工夫してやってみます。 ありがとうございます。

すると、全ての回答が全文表示されます。
  • Euglena
  • ベストアンサー率62% (5/8)
回答No.1

更新するレコードを特定する項目が主キー以外にないと厳しいです。 そういった項目があるのであれば、 UPDATE テーブル SET 主キー = *** WHERE id = inserted.id でいけるのですが・・ UPDATE テーブル SET 主キー = *** WHERE 主キー = inserted.主キー はかなり危険かも・・

Hk2001
質問者

補足

さそっくのご意見ありがとうございます。 その方法だと 何らかの対策をしないと トリガーが再起されませんか? その意味での危険ということかとは 思いますが・・・ とにかく明日にでもやってみます。 ありがとうございます。

すると、全ての回答が全文表示されます。

関連するQ&A