3

可能な限り簡単な方法で、SIP サーバーへの登録数を制限しようとしています。具体的には、usersテーブルのエントリ数を制限することにしました。サーバーは DBMS として PostgreSQL を実行しています。

特定のテーブルのエントリ数を制限することはできますか? たとえば、行数を 100 に制限し、古いエントリの一部を削除しない限り、そのテーブルにこれ以上エントリを追加したくないとします。

お知らせ下さい。

4

3 に答える 3

4

可能ですが、それはこの問題を解決するにはかなり悪い方法です。EXCLUSIVEテーブルのロックを取得し、コミットを許可する前にテーブルをチェックするトリガーを作成するcount()か、挿入によって追加される行が多すぎる場合はRAISE EXCEPTION、トランザクションを中止する必要があります。

実際には2つのトリガー。を実行するBEFORE INSERT OR DELETEトリガーとLOCK TABLE ... IN EXCLUSIVE MODE、テーブルAFTER INSERTの をチェックしCOUNTて例外を発生させるかどうかを決定するトリガーです。単純なトリガーでは不十分です。複数の行が追加さBEFOREれる可能性があるかどうかがわからないためです。複数の値を挿入した場合、または制限を超える可能性があります。INSERTINSERT ... SELECT

テーブルを更新したい他のセッションは、トランザクションがINSERT終了するまで待たなければなりません。アプリがこのように設計されていない場合、簡単にデッドロックが発生する可能性があります。

INSERTアプリはおそらく、セッション テーブルに入ったときにエラーが発生することを想定していないため、適切に処理されない可能性があります。ユーザーにきちんとした「登録が多すぎます」というエラーを与える可能性はかなり低いです。

これを行うのは絶対にひどい考えだと思うので、私はこれのサンプルトリガーを書いていません。SIP サーバーに登録できるユーザー数に制限を設定する場合は、SIP サーバーを適切に構成します。そのような構成オプションがない場合は、それを変更して追加するか、構成オプションを持つ別の SIP サーバーを使用します

于 2013-07-08T01:58:01.517 に答える
0

いつものように、グーグルは私をここに連れてきました:

CONSTRAINT nomore_than_x_rows
CHECK( table_id < 101 ); 

ID がシリアル型である場合

于 2015-09-06T06:54:54.477 に答える