0

ユーザーが1か月に5つのレコードを入力した後は、レコードを入力できないという制約を設定する必要があります。そのためのトリガーまたはプロシージャを作成することをお勧めしますか?それ以外の場合、制約を設定できる他の方法はありますか?

トリガーを作成する代わりに、制約のプロシージャを作成することを選択しましたが、プロシージャが機能しているかどうかを確認するにはどうすればよいですか?

手順は次のとおりです。

CREATE OR REPLACE PROCEDURE InsertReadingCheck
        (
         newReadNo          In Int,
         newReadValue       In Int,
         newReaderID        In Int,
         newMeterID         In Int  
        )
AS 
  varRowCount               Int;

BEGIN

Select Count(*) INTO varRowCount
From Reading 
WHERE ReaderID = newReaderID
AND Trunc(ReadDate,'mm') = Trunc(Sysdate,'mm');     

IF (varRowCount >= 5) THEN
    BEGIN
        DBMS_OUTPUT.PUT_LINE('*************************************************');
        DBMS_OUTPUT.PUT_LINE('');
        DBMS_OUTPUT.PUT_LINE(' You attempting to enter more than 5 Records ');
        DBMS_OUTPUT.PUT_LINE('');
        DBMS_OUTPUT.PUT_LINE('*************************************************');
        ROLLBACK;
  RETURN;
    END;

ELSIF (varRowCount < 5) THEN
    BEGIN
        INSERT INTO Reading
            VALUES(seqReadNo.NextVal, sysdate, newReadValue,
            newReaderID, newMeterID);
  COMMIT;
END;
END IF;
END; 

誰でも私が目を通すのを手伝ってくれる

4

4 に答える 4

2

これは、トリガーを入れることを避けるべき種類のものです。特にROLLBACKとCOMMIT。これは非常に危険なようです (そして、それが可能かどうかさえわかりません)。コミットしたい他のトランザクションがあり、ロールバックしたり、その逆の場合があります。

また、これをトリガーに入れる、次のエラーが発生します。

ORA-04091: 表XXXXは変更中です。トリガー/関数が参照できない可能性があります

これを回避する方法はありますが、それらは過度であり、正しいことを行うというオラクルの主張を回避するために何かファンキーなことをする必要があります.

これは、ストアド プロシージャを使用してテーブルにデータを挿入する絶好の機会です。挿入を実行する前に現在のレコードの数を確認できます。つまり、ROLLBACK を実行する必要はありません。

于 2012-11-12T08:53:21.740 に答える
0

これは動作の制約です。それは意見の問題ですが、この種のビジネスロジックをデータベースから除外するのは間違っています。代わりに、誰がレコード テーブルにどのレコードを追加したか、および何日/何時間に追跡したいと思います。SP を使用してこの情報を取得できますが、返されたデータに基づいて、ユーザーが特定のリンク (または関数) を表示できるかどうかをコード ビハインドで処理する必要があります。ユーザーがレコードを挿入するページにアクセスできないようにするか、読み取り専用ビューをユーザーに与えるかは、あなた次第です。

于 2012-11-12T04:15:22.983 に答える
0

アプリケーションに依存します。アプリケーションに挿入がすでに何度も存在する場合は、トリガーの方が適しています。

于 2012-11-12T04:21:34.993 に答える
0

すべての同時実行ルールに従うこの問題を解決できる宣言的な方法の 1 つは、別のテーブルを使用して、1 か月あたりのユーザーごとの挿入数を追跡することです。

create table inserts_check (
  ReaderID integer not null,
  month date not null,
  number_of_inserts integer constraint max_number_of_inserts check (number_of_inserts <= 5),
  primary key (ReaderID, month)
);

次に、挿入を 5 回までに制限する必要があるテーブル (またはすべてのテーブル) にトリガーを作成します。

create trigger after insert on <table>
for each row
begin
  MERGE INTO inserts_check t
  USING (select 5 as ReaderID, trunc(sysdate, 'MM') as month, 1 as number_of_inserts from dual) s
  ON (t.ReaderID = s.ReaderID and t.month = s.month)
  WHEN MATCHED THEN UPDATE SET t.number_of_inserts = t.number_of_inserts + 1
  WHEN NOT MATCHED THEN INSERT (ReaderID, month, number_of_inserts)
  VALUES (s.ReaderID, s.month, s.number_of_inserts);
end;

ユーザーが 5 回挿入すると、制約max_number_of_insertsは失敗します。

于 2012-11-12T10:34:38.060 に答える