Oracle SQL FGA系统上下文(‘;userenv’;,’;当前SQL’;)被截断
我想使用FGA和sys_context('userenv','current_sql')记录一个特定表中的所有语句,我可以接近我需要的内容,但看起来current_sql总是被截断为256个字符 我试图查看当前的_sql1到7,但它们总是空的。下面是我用来设置此设置的代码:Oracle SQL FGA系统上下文(‘;userenv’;,’;当前SQL’;)被截断,sql,oracle,triggers,audit,Sql,Oracle,Triggers,Audit,我想使用FGA和sys_context('userenv','current_sql')记录一个特定表中的所有语句,我可以接近我需要的内容,但看起来current_sql总是被截断为256个字符 我试图查看当前的_sql1到7,但它们总是空的。下面是我用来设置此设置的代码: create table emp_audit ( whodidit varchar2(40) , whenwasit timestamp , sql_executed varchar2(4000) , sql_execute
create table emp_audit
( whodidit varchar2(40)
, whenwasit timestamp
, sql_executed varchar2(4000)
, sql_executed1 varchar2(4000)
, sql_executed2 varchar2(4000)
, sql_executed3 varchar2(4000)
, sql_executed4 varchar2(4000)
, sql_executed5 varchar2(4000)
, sql_executed6 varchar2(4000)
, sql_executed7 varchar2(4000)
);
create or replace
package AUDIT_HANDLER
is
PROCEDURE HANDLE_EMP_SAL_ACCESS
( object_schema VARCHAR2
, object_name VARCHAR2
, policy_name VARCHAR2
);
end;
create or replace
package body AUDIT_HANDLER
is
PROCEDURE HANDLE_EMP_SAL_ACCESS
( object_schema VARCHAR2
, object_name VARCHAR2
, policy_name VARCHAR2
) is
PRAGMA AUTONOMOUS_TRANSACTION;
begin
insert into emp_audit
( whodidit, whenwasit, sql_executed, SQL_EXECUTED1, SQL_EXECUTED2, SQL_EXECUTED3, SQL_EXECUTED4, SQL_EXECUTED5, SQL_EXECUTED6, SQL_EXECUTED7)
values
( user, systimestamp, sys_context('userenv','current_sql'),sys_context('userenv','current_sql1'),sys_context('userenv','current_sql2'),sys_context('userenv','current_sql3'),sys_context('userenv','current_sql4'),sys_context('userenv','current_sql5'),sys_context('userenv','current_sql6'),sys_context('userenv','current_sql7'))
;
commit;
end HANDLE_EMP_SAL_ACCESS;
end;
begin
dbms_fga.add_policy
( object_schema=>'EPAT'
, object_name=>'PERSON'
, policy_name=>'PHI_ACCESS_HANDLED'
, handler_schema => 'SBOUCHAR'
, handler_module => 'AUDIT_HANDLER.HANDLE_EMP_SAL_ACCESS'
);
end;
似乎您必须在调用sys_上下文时指定长度:
sys_context('userenv','current_sql',4000)