Oracle记录用户输入,防范资料失控(oracle 保存输入)
Oracle数据库是一种常用的关系型数据库管理系统。它既有开源的MySQL和PostgreSQL版,也有企业版的Oracle Database。无论是哪一种版本,Oracle都非常注重保护用户的隐私和数据安全。其中一个非常重要的措施就是记录用户的输入,以防范数据失控。
在Oracle中,用户的每一次输入都会被记录下来。这可以通过设置审计选项来实现。审计可以在数据库的级别,对象的级别,或者是特定的用户级别进行设置。通过选择适当的选项,Oracle可以记录所有的改变,查看所有的SELECT, UPDATE, DELETE和INSERT语法,以及从哪些IP地址登录等信息。
例如,下面的代码展示了如何在Oracle中开启登陆审计:
“`SQL
SQL> ALTER SYSTEM SET audit_trl = DB, EXTENDED SCOPE = SPFILE;
SQL> ALTER SYSTEM SET audit_sys_operations = TRUE SCOPE = SPFILE;
SQL> ALTER SYSTEM SET audit_file_dest = ‘/u01/app/oracle/admin/orcl/adump’ SCOPE = SPFILE;
SQL> ALTER SYSTEM SET audit_syslog_level = local0.warning, syslog SCOPE = SPFILE;
SQL> ALTER SYSTEM SET audit_trl = TRUE SCOPE = SPFILE;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
代码中,`audit_trl`用于确定审计的级别,`audit_sys_operations`用于确定是否记录管理员的操作,`audit_file_dest`则指定了审计日志存放的位置。此外,还可以设置审计日志的格式、大小等参数。
除了登陆审计外,Oracle还可以记录所有数据库的DDL语句和DML语句(SELECT, UPDATE, DELETE和INSERT)。这里需要注意的是,DML语句只能记录用户的操作,而不能记录查询的结果。为了有效地记录DML语句,可以使用以下代码:
```SQLSQL> ALTER TABLE EMPLOYEES
ADD ( CREATED_BY VARCHAR2(200),
CREATED_DATE DATE, MODIFIED_BY VARCHAR2(200),
MODIFIED_DATE DATE );
SQL> CREATE OR REPLACE TRIGGER EMPLOYEES_AUDIT_TR
BEFORE INSERT OR UPDATE OR DELETE ON EMPLOYEES FOR EACH ROW
DECLARE v_event_type VARCHAR2(10);
BEGIN IF INSERTING THEN
v_event_type := 'INSERT'; ELSIF UPDATING THEN
v_event_type := 'UPDATE'; ELSIF DELETING THEN
v_event_type := 'DELETE'; END IF;
INSERT INTO AUDIT_TABLE (ACTION_TYPE, AUDIT_TIME, USER_ID, IP_ADDRESS, OLD_CONTENT, NEW_CONTENT)
VALUES (v_event_type, SYSDATE, USER, SYS_CONTEXT('USERENV', 'IP_ADDRESS'), :OLD.EMPLOYEE_ID||','||:OLD.FIRST_NAME||','||:OLD.LAST_NAME||','||:OLD.EML||','||:OLD.PHONE_NUMBER,
:NEW.EMPLOYEE_ID||','||:NEW.FIRST_NAME||','||:NEW.LAST_NAME||','||:NEW.EML||','||:NEW.PHONE_NUMBER );
END;/
代码中,`EMPLOYEES`表被设置了一个触发器,当有INSERT, UPDATE或DELETE语句执行时,触发器会将相应的信息记录到`AUDIT_TABLE`表中,包括事件类型、时间、用户ID、IP地址、旧内容和新内容。这种方式不仅能记录用户的操作,还能记录具体的内容变化。
在记录用户的输入时,还需要注意一些安全性问题。例如,必须避免将敏感信息存储在日志中,必须加密SA用户名和密码等。可以使用以下代码来实现加密:
“`SQL
SQL> ALTER SYSTEM SET SEC_MAX_FLED_LOGIN_ATTEMPTS = 6 DEFAULT SCOPE = SPFILE;
SQL> COL password FORMAT A50
SQL> SELECT DBMS_METADATA.get_ddl(‘USER’, ‘&USERNAME’) FROM DUAL;
SQL> PROMPT Enter user PASSWORD
SQL> ACCEPT password PROMPT ‘Enter password: ‘ HIDE
SQL> PROMPT Encrypted Password:
SQL> SELECT DBMS_CRYPTO.ENCRYPT(‘&PASSWORD’, DBMS_CRYPTO.HASH_MD5(‘&PASSWORD’, 1), UTL_RAW.CAST_TO_RAW(‘&USERNAME’)) FROM DUAL;
代码中,`SEC_MAX_FLED_LOGIN_ATTEMPTS`用于指定最大登陆失败次数;`DBMS_METADATA.get_ddl`用于获取用户的DDL语句;`DBMS_CRYPTO.ENCRYPT`用于加密密码。
综上所述,在使用Oracle数据库时,为了保护数据安全和用户隐私,必须充分利用审计功能,并遵循相关的安全规定和最佳实践。