CREATE OR REPLACE TRIGGER TRIG_EAF_01 BEFORE DDL ON DATABASE
DECLARE
N NUMBER;
STR_STMT VARCHAR;
SQL_TEXT DM_NAME_LIST_T;
BEGIN
N := DM_SQL_TXT(SQL_TEXT); //N 为占用嵌套表单元个数
FOR I IN 1..N
LOOP
STR_STMT := STR_STMT || SQL_TEXT(I); //STR_STMT 为获取的 DDL 语句
END LOOP;
INSERT INTO T_EAF VALUES(N,
STR_STMT,
DM_DICT_OBJ_NAME,
DM_DICT_OBJ_TYPE,
DM_DICT_OBJ_OWNER);
当事件触发器被触发时,可以通过这些事件属性函数获取当前事件的属性。
针对用户设置的数据库事件(DDL 语句执行),获取事件触发时的相关属性。事件属性
函数如下:
1、DM_DICT_OBJ_NAME,无参数,返回事件对象名;
2、DM_DICT_OBJ_TYPE,无参数,返回事件对象类型;
3、DM_DICT_OBJ_OWNER,无参数,返回事件对象所在模式;
4、DM_SQL_TXT,有 1 个输出参数,参数类型为 DM_NAME_LIST_T,返回值为 DDL
语句占用的嵌套表单元个数。DM_SQL_TXT 帮助用户获取事件被触发时正在执行的 DDL 语
句,用于存储获取到的 DDL 语句。DM_NAME_LIST_T 为元素类型为 varchar(64)的嵌套
表。因此如果 DDL 语句过长会导致分片存储,用户在获取 DDL 语句的时候,尤其要注意根
据返回值来循环读取嵌套表以获取完整的语句。
使用说明
1、系统内部 DDL 将不触发事件触发器
2、MPP 从节点的 DDL 将不触发事件触发器
下面用一个具体的例子来说明事件属性函数如何使用。
CREATE TABLE T_EAF
(
N INT,
SQLTEXT VARCHAR,
OBJECTNAME VARCHAR(128),
OBJECTTYPE VARCHAR(128),
OBJECTOWNER VARCHAR(128)
);
CREATE OR REPLACE TRIGGER TRIG_EAF_01 BEFORE DDL ON DATABASE
DECLARE
N NUMBER;
STR_STMT VARCHAR;
SQL_TEXT DM_NAME_LIST_T;
BEGIN
N := DM_SQL_TXT(SQL_TEXT); //N 为占用嵌套表单元个数
FOR I IN 1..N
LOOP
STR_STMT := STR_STMT || SQL_TEXT(I); //STR_STMT 为获取的 DDL 语句
END LOOP;
INSERT INTO T_EAF VALUES(N,
STR_STMT,
DM_DICT_OBJ_NAME,
DM_DICT_OBJ_TYPE,
DM_DICT_OBJ_OWNER);
END;
/
执行建模式建表语句。
create schema systest;
create table T_systest(c1 int);
然后,可以在 T_EAF 中查询到相关的建模式、建表语句。
SELECT * FROM T_EAF;
查询结果如下:
N SQLTEXT OBJECTNAME OBJECTTYPE OBJECTOWNER
1 create schema systest; SYSTEST SCHEMA SYSTEST
1 create table T_systest(c1 int); T_SYSTEST TABLE SYSTEST