【发布时间】:2015-11-24 13:25:09
【问题描述】:
我正在尝试在 SQL 解释器中创建触发器,但遇到了一些令人头疼的问题。
CREATE TRIGGER log_permission_role_rel_update AFTER UPDATE ON permission_role_rel
REFERENCING NEW ROW as newrow OLD ROW as oldrow
FOR EACH ROW
BEGIN ATOMIC
/* delete old row */
FOR SELECT * FROM TABLE(MYSCHEMA.simulate_by_permission_role_rel(oldrow.id_role, oldrow.id_permission)) simulationA
DO
CALL MYSCHEMA.log_proc('DELETE', 'SECVAL', 'test', '{}');
END FOR;
/* insert new row */
FOR SELECT * FROM TABLE(MYSCHEMA.simulate_by_permission_role_rel(newrow.id_role, newrow.id_permission)) simulationB
DO
CALL MYSCHEMA.log_proc('INSERT', 'SECVAL', '{}', 'test');
END FOR;
END;
上述语句导致错误,声称指令结束无效,并突出显示第二个 CALL 的结束作为罪魁祸首。
SQL State: 42601
Vendor Code: -104
Message: [SQL0104] Token <END-OF-INSTRUCTION> was not valid. Valid tokens: ;.
两个 FOR 循环都是独立工作的,只是当它们同时在同一个触发器下时就不行了。我真的不知道还有什么可以尝试的。我在这里做错了什么?为什么一个 FOR 循环可以工作,而不是两个?
谢谢。
编辑 (编辑以获取更多信息)
我在 iSeries、i5/OS 7.1 上的 DB2 下运行。我还通过 iNavigator 运行所有 SQL 语句。
编辑#2
所有的触发器似乎都是用这些属性创建的:
...
FOR EACH ROW
MODE DB2SQL
SET OPTION ALWBLK = *ALLREAD ,
ALWCPYDTA = *OPTIMIZE ,
COMMIT = *NONE ,
DECRESULT = (31, 31, 00) ,
DFTRDBCOL = MYSCHEMA,
DYNDFTCOL = *NO ,
DYNUSRPRF = *USER ,
SRTSEQ = *HEX
BEGIN
...
程序:
CREATE PROCEDURE MYSCHEMA.LOG_PROC (
IN OP VARCHAR(6) ,
IN TABLENAME VARCHAR(128) ,
IN OLDVAL VARCHAR(255) ,
IN NEWVAL VARCHAR(255) )
LANGUAGE SQL
SPECIFIC MYSCHEMA.LOG_PROC
NOT DETERMINISTIC
MODIFIES SQL DATA
CALLED ON NULL INPUT
SET OPTION ALWBLK = *ALLREAD ,
ALWCPYDTA = *OPTIMIZE ,
COMMIT = *NONE ,
DECRESULT = (31, 31, 00) ,
DFTRDBCOL = MYSCHEMA ,
DYNDFTCOL = *NO ,
DYNUSRPRF = *USER ,
SRTSEQ = *HEX
BEGIN
INSERT INTO AA_LEGACYLOG ( OPERATION , TABLENAME , OLDVALUE , NEWVALUE ) VALUES ( OP , TABLENAME , OLDVAL , NEWVAL ) ;
END ;
功能:
CREATE FUNCTION MYSCHEMA.SIMULATE_BY_PERMISSION_ROLE_REL (
ARG_ID_ROLE INTEGER ,
ARG_ID_PERMISSION INTEGER )
RETURNS TABLE (
USRCODE VARCHAR(10) ,
SECURABLE VARCHAR(12) ,
LG_INDX VARCHAR(1) ,
LG_VALO VARCHAR(10) ,
LG_ATRB VARCHAR(6) )
LANGUAGE SQL
SPECIFIC MYSCHEMA.SIMULATE_BY_PERMISSION_ROLE_REL
NOT DETERMINISTIC
READS SQL DATA
CALLED ON NULL INPUT
SET OPTION ALWBLK = *ALLREAD ,
ALWCPYDTA = *OPTIMIZE ,
COMMIT = *NONE ,
DECRESULT = (31, 31, 00) ,
DFTRDBCOL = MYSCHEMA ,
DYNDFTCOL = *NO ,
DYNUSRPRF = *USER ,
SRTSEQ = *HEX
RETURN (
SELECT DISTINCT A . USER_REF , P . SECURABLE , P . LG_INDX , P . LG_VALO , P . LG_ATRB
FROM ROLE R , PERMISSION P , ACTOR A , ACTOR_ROLE_REL
WHERE R . ID = ARG_ID_ROLE
AND P . ID = ARG_ID_PERMISSION
AND ACTOR_ROLE_REL . ID_ACTOR = ACTOR . ID
AND ACTOR_ROLE_REL . ID_ROLE = R . ID
GROUP BY A . USER_REF , P . SECURABLE , P . LG_INDX , P . LG_VALO , P . LG_ATRB
) ;
【问题讨论】:
-
我似乎根本无法更改终止符。我也尝试过 --#SET TERMINATOR %,但也不起作用。 db2 似乎不支持 iseries,尽管到目前为止我还没有找到可行的替代方案(我正在使用 ibm 的 i navigator)。有什么想法吗?
-
DB2 的操作系统版本是什么? (也可能什么是 DB2 组 PTF 级别?)
create a trigger in a SQL interpreter是什么意思?是否全部通过 iNav(仅向服务器发送语句)?语句终止符在这里不是问题。 -
顺便说一句,触发器创建属性应该编辑到问题中。
-
谢谢。是的,这一切都是通过 iNav 实现的。我现在无法访问系统,但我会在早上编辑问题。但是,触发器创建属性是什么意思?
标签: sql triggers db2 ibm-midrange