プロジェクトに元にできるログ機能を実装しようとしています。
ユーザーがDELETE_ROWプロシージャを使用してテーブルから行を削除すると、その行からすべての値を選択し、 LOG_DELETED_ROWプロシージャを使用して行の値をxmlとしてシリアル化することにより、row_historyテーブルに挿入し、元のテーブルから行を削除します。
Oracleの組み込み関数を使用したシリアル化は簡単でしたが、rowdataを逆シリアル化し、独自のテーブルに挿入し直す方法が見つかりませんでした。
その削除された行を別のテーブルに保存し、必要に応じて復元する方法はありますか?
削除手順:
create or replace procedure DELETE_ROW(tableName varchar2, userId varchar2, columnName varchar2, columnValue number) is
begin
log_deleted_row(tableName, userId, columnName, columnValue);
execute immediate 'delete from ' || tableName || ' where ' || columnName || ' = ' || columnValue;
end DELETE_ROW;
ロギング手順:
create or replace procedure LOG_DELETED_ROW(tableName varchar2, userId varchar2, columnName varchar2, columnValue number) is
tableId number;
begin
SELECT ID into tableId FROM TABLES WHERE NAME = tableName;
execute immediate
'INSERT INTO ROW_HISTORY(TABLE_ID,ROW_ID,ROW_DATA)
SELECT
'|| tableId ||',
'|| columnValue ||',
to_clob(
DBMS_XMLGEN.getxmltype(
''SELECT * FROM ' || tableName || ' where ' || columnName || ' = ' || columnValue || '''
)
)FROM DUAL';
end LOG_DELETED_ROW;
行履歴テーブル:
create table ROW_HISTORY
(
ID NUMBER not null,
TABLE_ID NUMBER not null,
ROW_ID NUMBER not null,
ROW_DATA CLOB not null
)