可能な限り簡単な方法で、SIP サーバーへの登録数を制限しようとしています。具体的には、users
テーブルのエントリ数を制限することにしました。サーバーは DBMS として PostgreSQL を実行しています。
特定のテーブルのエントリ数を制限することはできますか? たとえば、行数を 100 に制限し、古いエントリの一部を削除しない限り、そのテーブルにこれ以上エントリを追加したくないとします。
お知らせ下さい。
可能な限り簡単な方法で、SIP サーバーへの登録数を制限しようとしています。具体的には、users
テーブルのエントリ数を制限することにしました。サーバーは DBMS として PostgreSQL を実行しています。
特定のテーブルのエントリ数を制限することはできますか? たとえば、行数を 100 に制限し、古いエントリの一部を削除しない限り、そのテーブルにこれ以上エントリを追加したくないとします。
お知らせ下さい。
可能ですが、それはこの問題を解決するにはかなり悪い方法です。EXCLUSIVE
テーブルのロックを取得し、コミットを許可する前にテーブルをチェックするトリガーを作成するcount()
か、挿入によって追加される行が多すぎる場合はRAISE EXCEPTION
、トランザクションを中止する必要があります。
実際には2つのトリガー。を実行するBEFORE INSERT OR DELETE
トリガーとLOCK TABLE ... IN EXCLUSIVE MODE
、テーブルAFTER INSERT
の をチェックしCOUNT
て例外を発生させるかどうかを決定するトリガーです。単純なトリガーでは不十分です。複数の行が追加さBEFORE
れる可能性があるかどうかがわからないためです。複数の値を挿入した場合、または制限を超える可能性があります。INSERT
INSERT ... SELECT
テーブルを更新したい他のセッションは、トランザクションがINSERT
終了するまで待たなければなりません。アプリがこのように設計されていない場合、簡単にデッドロックが発生する可能性があります。
INSERT
アプリはおそらく、セッション テーブルに入ったときにエラーが発生することを想定していないため、適切に処理されない可能性があります。ユーザーにきちんとした「登録が多すぎます」というエラーを与える可能性はかなり低いです。
これを行うのは絶対にひどい考えだと思うので、私はこれのサンプルトリガーを書いていません。SIP サーバーに登録できるユーザー数に制限を設定する場合は、SIP サーバーを適切に構成します。そのような構成オプションがない場合は、それを変更して追加するか、構成オプションを持つ別の SIP サーバーを使用します。
いつものように、グーグルは私をここに連れてきました:
CONSTRAINT nomore_than_x_rows
CHECK( table_id < 101 );
ID がシリアル型である場合