在编译时创建触发器

Create a trigger on compile

为了防止 SQL 注入,我想验证过程、用户函数和包的所有 Varchar 参数。

是否可以在编译或创建新的存储过程或用户函数时创建触发器以强制所有开发人员添加此验证? 要验证参数,我需要调用一个用户函数来验证和清理 Varchar 类型的每个参数。

也许是一个起点:

CREATE OR REPLACE TRIGGER ddl_trigger
BEFORE CREATE OR ALTER
ON SCHEMA

DECLARE
 sql_text ora_name_list_t;
 v_sysevent VARCHAR2(32767);
 v_sql_text VARCHAR(32767);
 i        PLS_INTEGER;


BEGIN

 i := sql_txt(sql_text);

  select ora_sysevent,
         sql_text(1)
    into v_sysevent,
         v_sql_text
    from dual;

 dbms_output.put_line('Event: ' || v_sysevent);
 dbms_output.put_line('DDL: ' || v_sql_text);

END ddl_trigger;
/

v_sql_text包含正在执行的ddl的文本。或许您可以浏览 v_sql_text 以验证是否正在调用您需要的验证例程。