質問

PostgreSQL側のテーブルの最初の行の削除を防ぐことは可能ですか?

カテゴリテーブルがあり、デフォルトのカテゴリがアプリケーションを破壊する可能性があるため、デフォルトのカテゴリが削除されないようにします。もちろん、アプリケーションコードで簡単に実行できますが、データベースで実行した方がずっと良いでしょう。

deleteステートメントのルールと関係があると思いますが、ドキュメントで問題に近いものを見つけることができませんでした。

役に立ちましたか?

解決

これを達成するための最善の方法は、このテーブルに削除トリガーを作成することです。基本的に、ストアドプロシージャを記述して、この「デフォルト」カテゴリが常に存在することを確認し、このテーブルでトリガーON DELETEイベントを使用して強制する必要があります。これを行う良い方法は、DELETEイベントで「デフォルト」カテゴリ行が決して削除されないことを保証する行ごとのトリガーを作成することです。

トリガーとストアドプロシージャに関するPostgreSQLのドキュメントをご覧ください。

http://www.postgresql.org/docs/8.3 /interactive/trigger-definition.html

http://www.postgresql.org/docs/8.3/interactive /plpgsql.html

このwikiには貴重な例もあります:

http://wiki.postgresql.org/wiki/A_Brief_Real-world_Trigger_Example

他のヒント

あなたはルールシステムについて考えるのは正しかった。 こちらは、問題に一致する例へのリンクです。トリガーよりもさらに簡単です:

create rule protect_first_entry_update as
  on update to your_table
  where old.id = your_id
  do instead nothing;
create rule protect_first_entry_delete as
  on delete to your_table
  where old.id = your_id
  do instead nothing;

一部の回答では1つのポイントが欠落しています。保護された行の更新も制限する必要があります。それ以外の場合、禁止された削除条件を満たさなくなるように保護された行を最初に更新し、その後、保護されなくなったため更新された行を削除できます。

テーブル上でBEFORE DELETE トリガーを定義します。行を削除しようとすると(PKで一致するか、別の" protect"ブール列がある)、例外例外。

PostgreSQLの構文に慣れていませんが、のように見えますこれがあなたのやり方です:

CREATE FUNCTION check_del_cat() RETURNS trigger AS $check_del_cat$
    BEGIN            
        IF OLD.ID = 1 /*substitute primary key value for your row*/ THEN
            RAISE EXCEPTION 'cannot delete default category';
        END IF;

    END;
$check_del_cat$ LANGUAGE plpgsql;

CREATE TRIGGER check_del_cat BEFORE DELETE ON categories /*table name*/
    FOR EACH ROW EXECUTE PROCEDURE check_del_cat();

デフォルトのカテゴリを参照する別のテーブル(デフォルトと呼ばれる)に行を持つことができます。 FK制約は、デフォルトカテゴリの削除を許可しません。

トリガーの仕組みを覚えておいてください。 deleteステートメントが削除するすべての行に対して起動します。これは、トリガーを使用してはならないという意味ではありません。これを念頭に置いて、最も重要なのは使用シナリオをテストし、パフォーマンスが要件を満たしていることを確認することです。

ルールまたはトリガーを使用する必要がありますか

公式ドキュメントから: "両方で実装できるものについては、データベースの使用法に最も依存します。影響を受ける行に対してトリガーが1回起動されます。ルールはクエリを操作するか、追加のクエリを生成します。したがって、1つのステートメントで多くの行が影響を受ける場合、1つの追加コマンドを発行するルールは、1行ごとに呼び出され、その操作を何度も実行する必要があるトリガーよりも高速である可能性があります。ただし、トリガーアプローチは概念的にはルールアプローチよりもはるかに単純であり、初心者にとっては正しい方法です。

詳細については、ドキュメントを参照してください。
http://www.postgresql.org/docs/8.3/interactive/ rules-triggers.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top