需要记录在oracle中输入的数据
Need logs for the data entered in oracle
我已将数据输入到 oracle 数据库table 之一
Table 名字是 TABLE1,它有 3 列,即 (ROLL_NO, NAME, AGE)
CREATE TABLE TABLE1
(
ROLL_NO NUMBER NOT NULL,
NAME VARCHAR2(10),
AGE NUMBER
);
INSERT INTO TABLE1 VALUES(1, 'BOB', 20);
INSERT INTO TABLE1 VALUES(2, 'TOM', 21);
INSERT INTO TABLE1 VALUES(3, 'SAM', 22);
我只想要在 oracle 中输入的数据日志。我怎样才能得到输入这些数据的日志
您可以创建一个额外的 table 以保留那些 DML 日志,例如
CREATE TABLE log_table1
(
id NUMBER,
dml_type VARCHAR2(1),
roll_no NUMBER,
name VARCHAR2(10),
age NUMBER,
client_info VARCHAR2(64),
osuser VARCHAR2(128),
module VARCHAR2(64),
machine VARCHAR2(64),
time DATE
);
/
和一个数据库触发器来填充 table 以及为每个记录生成标识值的序列,例如
CREATE SEQUENCE seq_table1;
/
然后
CREATE OR REPLACE TRIGGER trg_log_table1
AFTER INSERT OR UPDATE OR DELETE ON table1
FOR EACH ROW
DECLARE
v_dml_type VARCHAR2(1):='I';
v_client_info v$session.client_info%TYPE;
v_osuser v$session.osuser%TYPE;
v_module v$session.module%TYPE;
v_machine v$session.machine%TYPE;
BEGIN
SELECT client_info, osuser, module, machine
INTO v_client_info, v_osuser, v_module, v_machine
FROM v$session
WHERE sid = sys_context('USERENV','SID');
IF inserting OR updating THEN
IF updating THEN v_dml_type := 'U'; END IF;
INSERT INTO log_table1
VALUES(seq_table1.nextval,v_dml_type,:new.roll_no,:new.name,:new.age,v_client_info, v_osuser, v_module, v_machine,SYSDATE);
ELSIF deleting THEN
v_dml_type := 'D';
INSERT INTO log_table1
VALUES(seq_table1.nextval,v_dml_type,:old.roll_no,:old.name,:old.age,v_client_info, v_osuser, v_module, v_machine,SYSDATE);
END IF;
END;
/
如果某些行的 client_info
和 module
得到 null 值,可能需要调用这些过程
dbms_application_info.set_module(i_module,i_action);
dbms_application_info.set_client_info(i_client);
从您访问数据库以填充这些列的应用程序。
我已将数据输入到 oracle 数据库table 之一
Table 名字是 TABLE1,它有 3 列,即 (ROLL_NO, NAME, AGE)
CREATE TABLE TABLE1
(
ROLL_NO NUMBER NOT NULL,
NAME VARCHAR2(10),
AGE NUMBER
);
INSERT INTO TABLE1 VALUES(1, 'BOB', 20);
INSERT INTO TABLE1 VALUES(2, 'TOM', 21);
INSERT INTO TABLE1 VALUES(3, 'SAM', 22);
我只想要在 oracle 中输入的数据日志。我怎样才能得到输入这些数据的日志
您可以创建一个额外的 table 以保留那些 DML 日志,例如
CREATE TABLE log_table1
(
id NUMBER,
dml_type VARCHAR2(1),
roll_no NUMBER,
name VARCHAR2(10),
age NUMBER,
client_info VARCHAR2(64),
osuser VARCHAR2(128),
module VARCHAR2(64),
machine VARCHAR2(64),
time DATE
);
/
和一个数据库触发器来填充 table 以及为每个记录生成标识值的序列,例如
CREATE SEQUENCE seq_table1;
/
然后
CREATE OR REPLACE TRIGGER trg_log_table1
AFTER INSERT OR UPDATE OR DELETE ON table1
FOR EACH ROW
DECLARE
v_dml_type VARCHAR2(1):='I';
v_client_info v$session.client_info%TYPE;
v_osuser v$session.osuser%TYPE;
v_module v$session.module%TYPE;
v_machine v$session.machine%TYPE;
BEGIN
SELECT client_info, osuser, module, machine
INTO v_client_info, v_osuser, v_module, v_machine
FROM v$session
WHERE sid = sys_context('USERENV','SID');
IF inserting OR updating THEN
IF updating THEN v_dml_type := 'U'; END IF;
INSERT INTO log_table1
VALUES(seq_table1.nextval,v_dml_type,:new.roll_no,:new.name,:new.age,v_client_info, v_osuser, v_module, v_machine,SYSDATE);
ELSIF deleting THEN
v_dml_type := 'D';
INSERT INTO log_table1
VALUES(seq_table1.nextval,v_dml_type,:old.roll_no,:old.name,:old.age,v_client_info, v_osuser, v_module, v_machine,SYSDATE);
END IF;
END;
/
如果某些行的 client_info
和 module
得到 null 值,可能需要调用这些过程
dbms_application_info.set_module(i_module,i_action);
dbms_application_info.set_client_info(i_client);
从您访问数据库以填充这些列的应用程序。