0

古いバージョンのSybaseのトリガーに何かを実装するのに頭が痛いだけで、誰かが助けてくれるかどうか疑問に思いました。簡単に言えば、影響を受けるレコードごとに別の sproc を呼び出すトリガーを作成したいと考えています (挿入、削除、または両方 [更新])。

T-SQL(SQL Server)でこれを行う1つの方法は、カーソルを使用することですが、Webで見つけたカーソルの例はどれも実際にSybase ASA 6.0.4で動作しないようです.T-SQLが嫌いです.または、コンパイルされているように見えますが、通常は何もしません (病理学的に単純で不自然なシナリオであっても)。

基本的に、すべての「挿入された」テーブル レコード (存在する場合) をループし、 Exec MySproc (inserted.keyid)ごとにループしてから、すべての「削除された」テーブル レコード (存在する場合) をループし、それぞれについてもう一度ループします。 1 つのExec MySproc (deleted.keyid)

この種のことを行う例、またはASA 6で読み取り専用カーソルを使用する例はありますか? オンラインマニュアルには単純なカーソルの例があるようですが、実際にはその例を実際に機能させることができませんでした。他の sproc をトリガーに展開することもできます (実際にはそれほど複雑ではありません) が、「挿入されたものから選択...」タイプのステートメントの一部として実行するには複雑すぎます。実際には、それ自体が数行のコードです . したがって、とにかくカーソルが必要だと思います。

EDIT : (29/12/09) - 必死になって sproc コードを展開しましたが、Sybase ASA 6 で実際に動作するカーソルの例が欲しいのです。簡単に広げられます。だから私は賞金のためにこれを投げます -誰かが私に実用的な例を与えることができますか? :-)

4

1 に答える 1

1

ROW LEVEL トリガーを探しているようです。

デフォルトでは、ASA のトリガーはステートメント レベルです (トリガーは、トリガー ステートメント全体が完了した後に 1 回実行されます)。一方、行レベルのトリガーは、変更された行ごとに 1 回実行されます。

行レベルのトリガーの例を次に示します。

CREATE TRIGGER tr_log
AFTER UPDATE OF "myfield"
ON mytable
REFERENCING OLD AS old_data NEW AS new_data

FOR EACH ROW

BEGIN
    Insert into Narc_USER_INFO_Change (Field_Changed, New_Value, Original_Value, user)
    Values('myfield', new_data.myfield,  old_data.myfield, CURRENT USER);
END
于 2010-01-02T18:15:03.510 に答える