华南农业大学大数据库系统概念实验报告材料七Word下载.docx
《华南农业大学大数据库系统概念实验报告材料七Word下载.docx》由会员分享,可在线阅读,更多相关《华南农业大学大数据库系统概念实验报告材料七Word下载.docx(31页珍藏版)》请在冰豆网上搜索。
1.完成实验指导书实验七所有实验内容
【训练1】
CREATETABLElogs(
LOG_IDNUMBER(10)PRIMARYKEY,
LOG_TABLEVARCHAR2(10)NOTNULL,
LOG_DMLVARCHAR2(10),
LOG_KEY_IDNUMBER(10),
LOG_DATEDATE,
LOG_USERVARCHAR2(15)
);
CREATESEQUENCElogs_id_squINCREMENTBY1
STARTWITH1MAXVALUE9999999NOCYCLENOCACHE;
CREATEORREPLACETRIGGERDML_LOG
BEFORE--触发时间为操作前
DELETEORINSERTORUPDATE--由三种事件触发
ONemp
FOREACHROW--行级触发器
BEGIN
IFINSERTINGTHEN
INSERTINTOlogsVALUES(logs_id_squ.NEXTVAL,'
EMP'
'
INSERT'
:
new.empno,SYSDATE,USER);
ELSIFDELETINGTHEN
INSERTINTOlogsVALUES(logs_id_squ.NEXTVAL,'
DELETE'
old.empno,SYSDATE,USER);
ELSE
UPDATE'
ENDIF;
END;
INSERTINTOemp(empno,ename,job,sal)VALUES(8001,'
MARY'
CLERK'
1000);
COMMIT;
SELECT*FROMLOGS;
【练习1】修改、删除刚刚插入的雇员记录,提交后检查LOGS表的结果。
updateemp
setsal=sal*5
whereename='
;
COMMIT;
DELETEFROMempWHEREempno=8001;
【练习2】为DEPT表创建同样的触发器,使用LOGS表进行记录,并检验结果。
CREATEORREPLACETRIGGERDEPT_LOG
ONdept
DEPT'
new.deptno,SYSDATE,USER);
old.deptno,SYSDATE,USER);
INSERTINTOdept(deptno,dname,loc)VALUES(50,'
JIAN'
GUANGZHOU'
);
【训练2】
CREATETABLElogerr(
NUMNUMBER(10)NOTNULL,
MESSAGEVARCHAR2(50)NOTNULL
CREATEORREPLACETRIGGERlog_sal
BEFORE
UPDATEOFsal
FOREACHROW
WHEN(new.job='
AND(ABS(new.sal-old.sal)>
200))
DECLARE
v_noNUMBER;
SELECTCOUNT(*)INTOv_noFROMlogerr;
INSERTINTOlogerrVALUES(v_no+1,'
雇员'
||:
new.ename||'
的原工资:
'
old.sal||'
新工资:
new.sal);
UPDATEempSETsal=sal+550WHEREempno=7788;
UPDATEempSETsal=sal+500WHEREempno=7369;
UPDATEempSETsal=sal+50WHEREempno=7876;
SELECT*FROMlogerr;
【训练3】
CREATEORREPLACETRIGGERCHECK_SAL
UPDATE
IF:
new.job='
AND(:
new.sal<
500OR:
new.sal>
2000)THEN
RAISE_APPLICATION_ERROR(-20001,'
工资修改超出范围,操作取消!
UPDATEempSETsal=800WHEREempno=7876;
UPDATEempSETsal=450WHEREempno=7876;
SELECTempno,ename,job,salFROMempWHEREempno=7876;
【练习3】限定对emp表的修改,只能修改部门10的雇员工资。
CREATEORREPLACETRIGGERCHECK_NO
new.DEPTNO<
>
10THEN
修改的部门不符,操作取消!
UPDATEempSETsal=8000WHEREdeptno=20;
UPDATEempSETsal=6789WHEREdeptno=30;
UPDATEempSETsal=888WHEREdeptno=10;
select*fromemp;
【训练4】
CREATETRIGGERCASCADE_UPDATE
AFTER
UPDATEOFdeptno
ONDEPT
FOREACHROW
BEGIN
UPDATEEMPSETEMP.DEPTNO=:
NEW.DEPTNO
WHEREEMP.DEPTNO=:
OLD.DEPTNO;
UPDATEdeptSETdeptno=11WHEREdeptno=10;
SELECTempno,ename,deptnoFROMemp;
【练习4】建立级联删除触发器CASCADE_DELETE,当删除部门时,级联删除EMP表的雇员记录。
CREATETRIGGERCASCADE_DELETE
DELETE
ONDEPT
DELETEFROMEMPWHEREEMP.DEPTNO=:
DELETEFROMDEPTWHEREDEPTNO=11;
SELECT*FROMEMP;
SELECT*FROMDEPT;
【训练5】
CREATEORREPLACETRIGGERINITCAP
BEFOREINSERT
ONEMP
:
new.ename:
=INITCAP(:
new.ename);
END;
INSERTINTOemp(empno,ename,job,sal)VALUES(1000,'
BILL'
1500);
SELECTename,job,salFROMempWHEREempno=1000;
【练习5】限定一次对雇员的工资修改不超过原工资的10%。
CREATEORREPLACETRIGGERCHECK_SALARY
BEFORE
UPDATEOFSAL
IF:
new.SAL>
=:
old.SAL*1.1THEN
new.SAL:
old.SAL;
ELSIF:
new.SAL<
old.SAL*0.9THEN
SELECT*FROMEMPWHEREEMPNO=7876;
UPDATEEMPSETSAL=SAL*1.08WHEREEMPNO=7876;
7.2.4【训练1】
CREATEORREPLACETRIGGERCHECK_TIME
UPDATEORINSERTORDELETE
IF(TO_CHAR(SYSDATE,'
DY'
)IN('
SAT'
SUN'
))
ORTO_CHAR(SYSDATE,'
HH24'
)<
'
08'
)>
='
17'
THEN
RAISE_APPLICATION_ERROR(-20500,'
非法时间修改表错误!
ENDIF;
UPDATEEMPSETSAL=3000WHEREEMPNO=7369;
【练习1】设计一个语句级触发器,限定只能对数据库进行修改操作,不能对数据库进行插入和删除操作。
在需要进行插入和删除时,将触发器设置为无效状态,完成后重新设置为生效状态。
CREATEORREPLACETRIGGERonlyupdate
IFdeletingorinsertingthen
非法操作!
7.3
CREATEORREPLACETRIGGERNODROP_EMP
DROPONSCHEMA
IFSys.Dictionary_obj_name='
RAISE_APPLICATION_ERROR(-20005,'
错误信息:
不能删除emp表!
DROPTABLEemp;
7.4
CREATEVIEWemp_nameASSELECTenameFROMemp;
CREATEORREPLACETRIGGERchange_name
INSTEADOFINSERTONemp_name
DECLARE
V_EMPNONUMBER(4);
SELECTMAX(EMPNO)+1INTOV_EMPNOFROMEMP;
INSERTINTOemp(empno,ename)
VALUES(V_EMPNO,:
INSERTINTOemp_nameVALUES('
BROWN'
CREATEORREPLACETRIGGERdelete_from_ename
INSTEADOFDELETEONemp_name
RAISE_APPLICATION_ERROR(-20006,'
不能在视图中删除emp表的雇员!
实验七 创建触发器,进行表的同步复制
CREATEORREPLACETRIGGERcopytime
beforeINSertOFDELETEorUPDATEONcc;
ifinsertingthen
insertintocopynewvalues(:
newid);
elsifdeleting
thendeletecopynewwhereid=:
old.id;
elseupdatecopynewsetid:
=:
newidwhereid=:
oldid;
endif;
出现问题
解决方案
(列出遇到的问题及其解决方法)