为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:dm8
【操作系统】:centos7
【CPU】:x86
【问题描述】*:跨模式触发器创建成功了,但是貌似触发不了
ddl如下:
create or replace trigger "RSMTRIG"."TR_BI_APPROVER_INFO"
before INSERT
on "RSMDATA"."APPROVER_INFO"
referencing OLD ROW AS "OLD" NEW ROW AS "NEW"
for each row
declare
v_trigger_user varchar2(100);
v_trigger_date date;
cursor c_switch(cp_switch rsm_tr_switch.switch_for%type) is
select status from rsm_tr_switch
where trigger_name = 'TR_BI_APPROVER_INFO'
and switch_for = cp_switch;
v_status rsm_tr_switch.status%type;
v_sqlcode varchar2(6);
v_sqlerrm varchar2(200);
v_error_comment varchar2(300);
v_seq varchar2(20);
v_seq_no varchar2(20);
v_flag varchar2(10);
v_message varchar2(400);
v_seq2 varchar2(20);
v_flag2 varchar2(10);
v_message2 varchar2(400);
begin
v_error_comment:='before get_user';
v_trigger_user := pub_sys_package.get_user();
v_trigger_date := sysdate;
--需求来源:SLIS数据同步
--功能描述:seq自动生成流水号;
--对pk_serial的写入放在公共部分,不允许屏蔽,不得擅自改动
v_error_comment:='before pk_serial';
if :new.APPROVER_INFO_ID is null then
rsmcde.rsm_seq_package.get_seq('APPROVER_INFO', 'APPROVER_INFO_ID', 'RSMDATA',v_seq, v_flag, v_message );
if v_flag <> '1' then
raise_application_error(-20510,'APPROVER_INFO.APPROVER_INFO_ID对应的seq值出现异常:'||v_message);
end if;
:new.APPROVER_INFO_ID := v_seq;
end if;
rsmcde.rsm_seq_package.get_seq('APPROVER_INFO', 'PK_SERIAL', 'RSMDATA',v_seq, v_flag, v_message );
if v_flag <> '1' then
raise_application_error(-20510,'APPROVER_INFO.PK_SERIAL对应的seq值出现异常:'||v_message);
end if;
:new.pk_serial := v_seq;
v_error_comment:='before RSM_SYNCH';
open c_switch('RSM_SYNCH'); --获取子功能控制信息
fetch c_switch into v_status;
if c_switch%FOUND and v_status = '1' then
:new.created_user := v_trigger_user;
:new.created_date := v_trigger_date;
:new.updated_user := v_trigger_user;
:new.updated_date := v_trigger_date;
end if;
close c_switch;
--出错处理
exception
when others then
v_sqlcode :=sqlcode;
v_sqlerrm :=substr(sqlerrm,1,200);
insert into rsm_tr_error_log
(error_no , --系统错误代码
error_message , --系统错误信息
trigger_name , --出错的trigger
trigger_user , --出错的用户
trigger_date , --出错的时间
error_comment --出错详细信息
)
values
(v_sqlcode,
v_sqlerrm,
'TR_BI_APPROVER_INFO',
v_trigger_user,
v_trigger_date,
v_error_comment
);
end;
我简单测试了下,貌似应该可以才对,不过我这个试验过程比较简单。
--SYSDBA身份,创建 USER1、USER2两用户
CREATE USER USER1 IDENTIFIED BY 1234567890;
CREATE USER USER2 IDENTIFIED BY 1234567890;
GRANT PUBLIC,RESOURCE,SOI,VTI TO USER1;
GRANT PUBLIC,RESOURCE,SOI,VTI TO USER2;
--给USER1授权
GRANT CREATE ANY TRIGGER TO USER1;
--使用USER2身份登录
CONNECT USER2/1234567890
--建表 T_DATA
CREATE TABLE T_DATA
(
A INT
);
--使用USER1身份登录
CONNECT USER1/1234567890
--建表 T_LOG
CREATE TABLE T_LOG
(
TS TIMESTAMP,
OP VARCHAR2(100)
);
--创建跨模式触发器
CREATE OR REPLACE TRIGGER TR_IDU_T_DATA
BEFORE INSERT OR UPDATE OR DELETE
ON USER2.T_DATA
FOR EACH ROW
BEGIN
IF INSERTING THEN
:NEW.A := :NEW.A * 2;
INSERT INTO T_LOG(TS,OP) VALUES(SYSTIMESTAMP,'INSERT');
ELSIF UPDATING THEN
INSERT INTO T_LOG(TS,OP) VALUES(SYSTIMESTAMP,'UPDATE');
ELSE
INSERT INTO T_LOG(TS,OP) VALUES(SYSTIMESTAMP,'DELETE');
END IF;
END;
/
----------下面开始测试验证----------
--使用USER2身份登录
CONNECT USER2/1234567890
--插入测试数据
INSERT INTO T_DATA VALUES(1);
--提交事务
COMMIT;
--查询 T_DATA表中数据,A列值已经被触发器修改为2
SELECT * FROM T_DATA;
--切换到USER1身份
CONNECT USER1/1234567890
--检查LOG表中内容,应该能看到触发器写入数据
SELECT * FROM T_LOG;
达梦数据库对于表触发器是有限制的:表触发器不支持跨模式,即<触发器名>必须和<触发表名>、<触发视图名>的模式
名一致。若创建表触发器时不指定模式名,则模式名默认为触发表名或触发视图名;
因此,你的触发器需要创建在RSMDATA用户下。其他对应的进行调整,再试试呢。