您的位置:首页 > 数据库 > Oracle

Oracle触发器的简单使用

2013-01-31 23:59 225 查看
2013-01-31

  今天学习了点oracle,触发器的简单使用,需要解决的问题是如下,还是英文描述吧。

the triggers are perfect is change auditing.The example is of Paranoid Pam(who runs a bowling alley and have been receiving complaints about people cheating on their scores).she recently complete an oracle application to catch the cheaters.

simply say, she just want to find who and when and how change the data.

next, you will say my PL/SQL code.in the write i have use some may useful method to make it.

souce code:

--好的创建表的方法
DECLARE
TB NUMBER;
BEGIN
SELECT COUNT(*) INTO TB FROM TABS WHERE TABLE_NAME = 'FRAME';
IF TB <> 0 THEN
EXECUTE IMMEDIATE 'DROP TABLE frame';
EXECUTE IMMEDIATE '
CREATE TABLE frame
(
bowler_id number,
game_id number,
frame_id number,
strike varchar2(1) default ''N'',
spare varchar2(1) default ''N'',
score number,
constraint frame_pk
primary key (bowler_id,game_id,frame_id)
)';
DBMS_OUTPUT.PUT_LINE('存在该表已删除,并创建新的表');
ELSE
EXECUTE IMMEDIATE 'CREATE TABLE frame
(
bowler_id number,
game_id number,
frame_id number,
strike varchar2(1) default ''N'',
spare varchar2(1) default ''N'',
score number,
constraint frame_pk
primary key (bowler_id,game_id,frame_id)
)';
DBMS_OUTPUT.PUT_LINE('不存在该表,已创建新表');
END IF;
END;

--创建审计表
DECLARE
TB NUMBER;
BEGIN
SELECT COUNT(*) INTO TB FROM TABS WHERE TABLE_NAME = 'FRAME_AUDIT';
IF TB <> 0 THEN
EXECUTE IMMEDIATE 'DROP TABLE frame_audit';
EXECUTE IMMEDIATE '
CREATE TABLE frame_audit
(
bowler_id NUMBER,
game_id NUMBER,
frame_id NUMBER,
old_strike VARCHAR2(1),
new_strike VARCHAR2(1),

old_spare VARCHAR2(1),
new_spare VARCHAR2(1),

old_score VARCHAR2(1),
new_score VARCHAR2(1),

change_date DATE,
operation VARCHAR2(6)
)';
DBMS_OUTPUT.PUT_LINE('存在该表已删除,并创建新的表');
ELSE
EXECUTE IMMEDIATE 'CREATE TABLE frame_audit
(
bowler_id NUMBER,
game_id NUMBER,
frame_id NUMBER,
old_strike VARCHAR2(1),
new_strike VARCHAR2(1),

old_spare VARCHAR2(1),
new_spare VARCHAR2(1),

old_score VARCHAR2(1),
new_score VARCHAR2(1),

change_date DATE,
operation VARCHAR2(6)
)';
DBMS_OUTPUT.PUT_LINE('不存在该表,已创建新表');
END IF;
END;

--创建触发器
CREATE OR REPLACE TRIGGER audit_frames
AFTER INSERT OR UPDATE OR DELETE ON frame
FOR EACH ROW
BEGIN
IF inserting THEN
INSERT INTO frame_audit(bowler_id,game_id,frame_id,
new_strike,new_spare,
new_score,change_date,operation)
VALUES(:new.bowler_id,:new.game_id,:new.frame_id,:new.strike,:new.spare,:new.score,SYSDATE,'insert');

ELSIF updating THEN
INSERT INTO frame_audit(bowler_id,game_id,frame_id,
old_strike,new_strike,old_spare,new_spare,
old_score,new_score,change_date,operation)
VALUES(:new.bowler_id,:new.game_id,:new.frame_id,:old.strike,:new.strike,:old.spare,:new.spare,:old.score,:new.score,SYSDATE,'update');

ELSIF deleting THEN
INSERT INTO frame_audit(bowler_id,game_id,frame_id,
old_strike,old_spare,
old_score,change_date,operation)
VALUES(:old.bowler_id,:old.game_id,:old.frame_id,:old.strike,:old.spare,:old.score,SYSDATE,'insert');

END IF;
END audit_frames;

--在创建之后,后来使用的时候报了一个触发器无效且未通过认证的错误
--解决办法是找到触发器-》右键查看-》找到相应的错误(insert->inserting).问题解决。

INSERT INTO frame (bowler_id,game_id,frame_id,strike)
VALUES (1,2,3,'y');

SELECT * FROM frame;

UPDATE frame SET strike ='N',
spare = 'y'
WHERE bowler_id =1
AND game_id =2
AND frame_id =3;

DELETE frame WHERE bowler_id = 1;

COMMIT;

SELECT * FROM frame;

SELECT * FROM frame_audit;


代码可以放在pl/sql的sql脚本中运行,可以看到相应的结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: