-1

私は DBA の概念に非常に慣れていません。仕事の一環として、社内データマートを作成しました。データベースリンクを使用して、さまざまなソースに接続し、要求されたデータが何であれ、情報がこのマートに保存されます。データベースリンクを介して接続しているデータソースが日々変化するという要件があります。そのため、そのデータの変更を追跡したいと考えています。そのため、マテリアライズド ビューを作成し、これらのテーブルを月に 1 回更新する手順を作成しました。メイン テーブルは常に月に 1 回新しいデータで更新され、古いデータを履歴テーブルに送信することを意味します。そのため、これらのテーブルを更新する前に、データをメイン テーブルから履歴テーブルに移動する簡単なロジックを作成しました。例:その従業員テーブルをメインテーブルと仮定し、そのテーブルの履歴を維持するために、次のような簡単なステートメントを書いています

create table employee_hst as select * from employee;(タイムスタンプ付き)

しかし、その単純なステートメントは私の目的には役立っていません。

私の要件は、履歴を 6 か月だけ保持する必要があるためです。つまり、履歴テーブルには 6 か月分の履歴データのみを保持する必要があります。ですから、履歴データに 6 か月前のデータのみを保存し、6 か月以上のデータを自動的に削除する方法を教えてください。

あなたの提案を手伝ってください。

前もって感謝します

4

4 に答える 4

1

これは、scott.emp テーブルに基づいて必要になる可能性のあるものの簡略化されたバージョンです。まず、クエリと出力を示します。INTERVAL または ADD_MONTHS を使用して、過去 6 か月のデータを取得することもできます。

SELECT * FROM
(
 SELECT deptno, empno, ename, end_date AS hiredate
      , TRUNC(MONTHS_BETWEEN(sysdate, end_date)) months_of_service  
  FROM emp_test
)
WHERE months_of_service <= 6 -- past 6 moths data only
ORDER BY 1
/

DEPTNO    EMPNO    ENAME     HIREDATE    MONTHS_OF_SERVICE
------------------------------------------------------------
10        7782     CLARK     11/2/2012    4
10        7934     MILLER    9/2/2012     6
...
20        7902     FORD      9/2/2012     6
20        7566     JONES     10/2/2012    5
...
30        7935     WALSH     12/2/2012    3
30        7900     JAMES     9/2/2012     6
30        7844     TURNER    1/27/2013    1
...

以下の例は投稿に基づいています。毎回テーブルを再作成し、データを入力したいと考えています。テーブルを切り捨ててデータを再挿入することもできます - あなた次第です。個人的には、テーブルを動的に削除/作成する代わりに、切り捨て/挿入を選択します。

パラメータとしてテーブル名を使用してプロシージャを作成するか、ブロックを手動で実行するか、DBMS_SCHEDULER またはその他のツールを使用してスケジュールして、SCHEDULER に渡す時間間隔ごとに自動的に実行されるようにします。

テーブル名の前にスキーマ名を追加します。ドロップ テーブル パーツの下で実行する前にテーブルが既に存在する場合は、コードから例外パーツを削除します。「ORA-00942: テーブルまたはビューが存在しません」というメッセージが表示された場合は、例外が必要です。

DECLARE
  v_tab_name VARCHAR2(100):= 'emp_test2';
BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE '|| v_tab_name; -- may truncate then insert 
  -- This exception will handle ORA-00942: table or view does not exist
  -- If table already exists before you run this then you may remove it from code
  EXCEPTION WHEN OTHERS 
  THEN
    BEGIN
      EXECUTE IMMEDIATE 'CREATE TABLE '||v_tab_name||' AS -- or insert into select...
                  SELECT * FROM
                   (
                   SELECT deptno, empno, ename, end_date
                        , TRUNC(MONTHS_BETWEEN(sysdate, end_date)) months_of_service  
                     FROM emp_test
                   )
                   WHERE months_of_service <= 6
                  ORDER BY 1'; 

       EXCEPTION WHEN OTHERS THEN dbms_output.put_line(SQLCODE||' '||SQLERRM); 
    END;
 END;
/
于 2013-03-26T19:35:32.220 に答える
0

次のストアド プロシージャを作成できます。

  1. 履歴に挿入します
  2. 実体化されたビューを更新します
  3. 履歴から削除where DateCreated < Sysdate - 180
于 2013-03-26T17:42:54.860 に答える
0

ほとんどすべての RDBMS には、 Oracleを含め、何らかのスケジューリング サービスがそのまま残っています。

最善の策は、このサービスにスケジュールされたジョブを追加することです。これにより、6 か月 (または 180 日など) より古いすべての履歴が削除されます。

于 2013-03-26T19:04:28.317 に答える
0

INSERT/UPDATE/DELETE で実行される従業員テーブルにトリガーを作成できますか。これにより、次の 2 つのことが行われます。1) 履歴テーブルの現在のレコードをコピーします。履歴テーブルには、アクション「INSERT/UPDATE/DELETE」とタイムスタンプ フィールドを保持する varchar[20] または同様のものとして別のフィールドがあります。2 番目のアクションは、履歴テーブル内の 180 日より前のレコードを削除することです。

于 2013-03-26T17:47:36.060 に答える