1

ある課題で、タグ付けされた質問とコメント付きの回答を備えた非常に単純な Q/A サイトを作成する任務を負っています。

要件の 1 つは、重複するタグの挿入を検出するトリガーを用意することです。そのような場合は、既存のタグの使用カウンターをインクリメントします。
問題は、を含むトランザクション全体をロールバックしてトリガーをキャンセルできず、トリガーUPDATEの目的が無効になることです。

それをやってのける方法についてのアイデアはありますか?

アップデート

要件は次のように表現されます。

"追加するタグがデータベースに存在しないかどうかをチェックするトリガーを作成します。存在する場合は、対応する行の使用列を 1 増やす必要があります"
(原文: " Crear el trigger tg_insertar_tag que revise que cualquier nuevo tag que se agregue no exista antes en la base de datos ; en caso de existir, se debe incremental en 1 la columna “usos” de la tabla tag del registro que Corresponda ")

この要件を変更または回避することはできませんが、抜け穴は歓迎されます。


参考までに、私の現在のトリガーコード:

CREATE OR REPLACE TRIGGER tg_insertar_tag BEFORE INSERT ON Tag
FOR EACH ROW
DECLARE
    tagCount integer;
    v_usos integer;
BEGIN
    SELECT COUNT(*) INTO tagCount FROM Tag WHERE nombre = :new.nombre;
    SELECT Usos INTO v_usos FROM Tag WHERE nombre = :new.nombre;
    IF tagCount > 0 THEN
        UPDATE Tag SET usos = v_usos + 1 WHERE nombre = :new.nombre;
    ELSE
        :new.usos := 1;
    END IF;
END;
4

2 に答える 2

1

それは、テーブルのトリガーの目的ではありません。

MERGEストアド プロシージャ、トリガー、またはクライアントからのステートメントを使用する必要がINSTEAD OFあります。

MERGE
INTO    tag tc
USING   (
        SELECT  :NEW.nombre
        FROM    dual
        ) t
ON      (tc.nombre = t.nombre)
WHEN MATCHED THEN
UPDATE
SET     usos = usos + 1
WHEN NOT MATCHED THEN
INSERT  (nombre, usos)
VALUES  (nombre, 1)

パフォーマンスに関しては、コレクション内のすべてのタグをクライアントから渡し、次のクエリを実行するのが最善です。

MERGE
INTO    tag tc
USING   (
        SELECT  tag, COUNT(*) AS cnt
        FROM    TABLE(:mycollection)
        GROUP BY
                nombre
        ) t
ON      (tc.nombre = t.nombre)
WHEN MATCHED THEN
UPDATE
SET     usos = usos + cnt
WHEN NOT MATCHED THEN
INSERT  (nombre, usos)
VALUES  (nombre, cnt)

コレクションをパラメータとして受け入れるストアドプロシージャで。

于 2010-09-12T23:22:57.993 に答える
0

また...

この種のロジックを同じまたは類似の構造を持つ別のテーブルに配置します。

次に、挿入が成功したら、ポスト トリガー ロジックを使用して、それをプライマリ テーブルにも挿入します。

于 2010-09-12T23:51:45.123 に答える