PostgreSQL側でテーブルの最初の行が削除されないようにすることはできますか?
カテゴリ テーブルがあり、アプリケーションが壊れる可能性があるため、既定のカテゴリが削除されないようにしたいと考えています。もちろん、アプリケーション コードで簡単に実行できますが、データベースで実行する方がはるかに優れています。
削除ステートメントのルールと関係があると思いますが、ドキュメントで問題に近いものを見つけることができませんでした。
PostgreSQL側でテーブルの最初の行が削除されないようにすることはできますか?
カテゴリ テーブルがあり、アプリケーションが壊れる可能性があるため、既定のカテゴリが削除されないようにしたいと考えています。もちろん、アプリケーション コードで簡単に実行できますが、データベースで実行する方がはるかに優れています。
削除ステートメントのルールと関係があると思いますが、ドキュメントで問題に近いものを見つけることができませんでした。
ルールシステムを考えたあなたは正しかった。これは、問題に一致する例へのリンクです。トリガーよりもさらに簡単です。
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;
一部の回答では、保護された行の更新も制限する必要があります。それ以外の場合は、最初に保護された行を更新して、禁止された削除基準を満たさないようにし、更新された行を保護されなくなったので削除することができます。
トリガーがどのように機能するかを覚えておいてください。これらは、deleteステートメントが削除するすべての行に対して起動します。これは、トリガーを使用するべきではないという意味ではありません。これを念頭に置いて、最も重要なこととして、使用シナリオをテストし、パフォーマンスが要件を満たしていることを確認してください。
ルールまたはトリガーを使用する必要がありますか?
公式ドキュメントから:「両方で実装できるものについては、データベースの使用状況に応じて最適です。影響を受ける行に対してトリガーが1回起動されます。ルールがクエリを操作するか、追加のクエリを生成します。 1つのステートメントで多くの行が影響を受けるため、1つの追加コマンドを発行するルールは、すべての行に対して呼び出され、その操作を何度も実行する必要があるトリガーよりも高速である可能性があります。ただし、トリガーアプローチは、概念的にはルールアプローチよりもはるかに単純です。 、そして初心者が正しく理解するのは簡単です。」
詳細については、ドキュメントを参照してください。
http://www.postgresql.org/docs/8.3/interactive/rules-triggers.html