关于Oracle触发器的一个无知的问题

sailer_shi 2005-01-30 02:38:54
请教各位大虾一个问题:我编写了一个触发器,是关于表删除的,但是我怎么测试呀?我所谓的测试就是一步步的跟着走!我用PLSQL Developer这个工具,或者Toad也可以!希望尽快给我答案,要不然过年我回不了家呀 可怜一下小弟吧

@_@
...全文
232 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ashzs 2005-02-02
  • 打赏
  • 举报
回复
只是个人习惯问题!
SInoyew 2005-02-02
  • 打赏
  • 举报
回复
哦,提前祝各位新年快乐。
学习,进步!
jiangchuanli 2005-02-02
  • 打赏
  • 举报
回复
参考:
---------------------------------------
DROP TRIGGER CityAUDIT;

CREATE TRIGGER CityAUDIT
AFTER INSERT OR UPDATE OR DELETE
ON City
FOR EACH ROW

DECLARE
RASEQ CityAUDIT.ASEQ%TYPE;
BEGIN
IF INSERTING THEN
SELECT NVL(MAX(ASEQ),0) + 1
INTO RASEQ
FROM CityAUDIT
WHERE CityCode = :NEW.CityCode;

INSERT INTO CityAUDIT
(CityPhoneCode,
CityCode,
CityName,
CountryCode,
GMTDiff,
ASEQ,
ASTA,
INPUTER,
INPUTDATE)
VALUES
(:NEW.CityPhoneCode,
:NEW.CityCode,
:NEW.CityName,
:NEW.CountryCode,
:NEW.GMTDiff,
RASEQ,
'1',
USER,
SYSDATE);
END IF;

IF UPDATING THEN
SELECT ASEQ + 1
INTO RASEQ
FROM CityAUDIT
WHERE CityCode = :NEW.CityCode
AND ASTA = '1';

UPDATE CityAUDIT
SET ASTA = '3'
WHERE CityCode = :NEW.CityCode
AND ASTA = '1';

INSERT INTO CityAUDIT
(CityPhoneCode,
CityCode,
CityName,
CountryCode,
GMTDiff,
ASEQ,
ASTA,
INPUTER,
INPUTDATE)
VALUES
(:NEW.CityPhoneCode,
:NEW.CityCode,
:NEW.CityName,
:NEW.CountryCode,
:NEW.GMTDiff,
RASEQ,
'1',
USER,
SYSDATE);
END IF;
IF DELETING THEN
SELECT ASEQ + 1
INTO RASEQ
FROM CityAUDIT
WHERE CityCode = :OLD.CityCode
AND ASTA = '1';

UPDATE CityAUDIT
SET ASTA = '3'
WHERE CityCode = :OLD.CityCode
AND ASTA = '1';

INSERT INTO CityAUDIT
(CityPhoneCode,
CityCode,
CityName,
CountryCode,
GMTDiff,
ASEQ,
ASTA,
INPUTER,
INPUTDATE)
VALUES
(:OLD.CityPhoneCode,
:OLD.CityCode,
:OLD.CityName,
:OLD.CountryCode,
:OLD.GMTDiff,
RASEQ,
'2',
USER,
SYSDATE);
END IF;

END;
/
--------------------------------------------------------
以上依自己情况可以简化的。
如测试语句,在sqlplus下可以测(前提要有trigger表),或在toad、PLSQL Developer都可以的。
如测试功能,在招待删除表记录后,查看trigger表的数据,就实现了。
GerryYang 2005-02-02
  • 打赏
  • 举报
回复
写触发器,不用单不调试吧?
直接用dbms_output.put_line(你想要的信息);
kzy7517 2005-02-01
  • 打赏
  • 举报
回复
在PL/SQL Developer中写一个过程对表进行操作触发触发器动作,只需单步调试此过程,就可以调试到触发器。Toad没搞过。
langxiaofeng 2005-02-01
  • 打赏
  • 举报
回复
QQ:23094840一起学习.
langxiaofeng 2005-02-01
  • 打赏
  • 举报
回复
ORACLE是前触发.
sailer_shi 2005-02-01
  • 打赏
  • 举报
回复
谢谢大哥们,但是ashzs说得第一个问题怎么办呀?我真的没有想过呀,希望能给答案咯 呵呵

好了
祝大家新春快乐,万事如意
ashzs 2005-01-30
  • 打赏
  • 举报
回复
在sqlplus下测!
在触发器中相应关键处(如要删除表记录)用dbms_output.putline('delete !!!');
等语句进行标示!在sqlplus下先执行set serverout on 然后就可以执行出发触发器的
条件了!看看print的内容是不是你想要的流程和效果!如果有错误提示还可以相应的
进行检查!
另外:
1、最好别对PLSQL Developer和toad产生依赖!有的环境下没有toad等单步调试工具,你该怎么办!?!
2、在测试之前,将可能产生影响的表,做一下备份:
create table tablename_bak as select * from tablename;
3、祝你能顺利回家过年!一路顺风!
playmud 2005-01-30
  • 打赏
  • 举报
回复
CREATE OR REPLACE TRIGGER tr_trace_ddl
AFTER DDL ON DATABASE
DECLARE
sql_text ora_name_list_t;
state_sql ddl$trace.ddl_sql%TYPE;
BEGIN
FOR i IN 1..ora_sql_txt(sql_text) LOOP
state_sql := state_sql||sql_text(i);
END LOOP;
INSERT INTO ddl$trace(login_user,ddl_time,ip_address,audsid,
schema_user,schema_object,ddl_sql)
VALUES(ora_login_user,SYSDATE,userenv('SESSIONID'),
sys_context('USERENV','IP_ADDRESS'),
ora_dict_obj_owner,ora_dict_obj_name,state_sql);
EXCEPTION
WHEN OTHERS THEN
sp_write_log('Capture DDL Excption:'||SQLERRM);
END tr_trace_ddl;
在创建以上触发器时要注意几点
1、必须创建一个ddl$trace的表,用来记录ddl的记录
2、sp_write_log原本是一个写日志的过程,可以置换为自己的需要,如null跳过。
dakunlinux 2005-01-30
  • 打赏
  • 举报
回复
关注

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧