在生活中,很多人都不知道oracle 触发器(oracle 触发器用法|附实例讲解) 是什么意思,其实他的意思是非常简单的,下面就是小编搜索到的oracle 触发器(oracle 触发器用法|附实例讲解) 相关的一些知识,我们一起来学习下吧!
oracle触发器(Oracle触发器用法|示例说明)
【资料图】
一.触发器介绍
触发器的定义是指当某个条件成立时,触发器中定义的语句会自动执行。
所以触发器不需要人工调用,也不能调用。
然后,触发器的触发条件实际上是在你定义的时候设置的。
触发器可以分为语句级触发器和行级触发器。简单来说,语句级触发器可以在一些语句执行之前或之后被触发。当定义的触发表中的行数据发生变化时,行级触发器被触发一次。
具体例子:
1.在表中定义的语句级触发器。当该表被删除时,程序将自动执行触发器中定义的操作过程。这个删除表的操作是触发器执行的条件。
2.行级触发器在表中定义。当该表中的一行数据发生变化时,如删除一行记录,触发器将自动执行。
二、触发器语法
触发器的语法:
create[orreplace]tigger触发器名触发时间触发事件on表名[foreachrow]beginpl/sql语句end其中包括:
触发器名称:触发器对象的名称。因为触发器是由数据库自动执行的,所以名称只是一个名称,没有实际用途。
触发时间:表示触发器何时执行,取值如下:
Before:指示触发器在数据库操作之前执行;
After:指示触发器在数据库操作之后执行。
触发事件:指示哪些数据库操作将触发此触发器:
插入:该触发器将由数据库插入触发;
更新:数据库修改将触发此触发器;
删除:数据库删除触发此触发器。
表:数据库触发器所在的表。
对于每一行:触发器对表中的每一行执行一次。如果没有这个选项,整个表只执行一次。
功能
触发器可以实现以下功能:
1.允许/限制表修改。
2.自动生成派生列,如自增字段。
3.强制数据一致性
4.提供审计和日志记录。
5.防止无效交易。
6.启用复杂的业务逻辑。
例子
1)在更新tb_emp表之前,触发了以下触发器,因此不允许在周末修改该表:
createorreplacetriggerauth_securebeforeinsertorupdateorDELETEontb_empbeginIF(to_char(sysdate,"DY")="星期日")THENRAISE_APPLICATION_ERROR(-20600,"不能在周末修改表tb_emp");ENDIF;END;/2)利用触发器实现序列号自动递增
创建测试表:
createtabletab_user(idnumber(11)primarykey,usernamevarchar(50),passwordvarchar(50));创建一个序列:
创建序列my_seq递增1从1开始nomaxvalue nocycle高速缓存20;
创建触发器:
CREATEORREPLACETRIGGERMY_TGRBEFOREINSERTONTAB_USERFOREACHROW--对表的每一行触发器执行一次DECLARENEXT_IDNUMBER;BEGINSELECTMY_SEQ.NEXTVALINTONEXT_IDFROMDUAL;:NEW.ID:=NEXT_ID;--:NEW表示新插入的那条记录END;将数据插入表格:
insertintotab_user(username,password)values("admin","admin");insertintotab_user(username,password)values("fgz","fgz");insertintotab_user(username,password)values("test","test");COMMIT;查询表结果:SELECT * FROM TAB _ USER
3)当用户在测试表上执行DML语句时,在日志表中记录相关信息。
--创建测试表CREATETABLEtest(t_idNUMBER(4),t_nameVARCHAR2(20),t_ageNUMBER(2),t_sexCHAR);--创建记录测试表CREATETABLEtest_log(l_userVARCHAR2(15),l_typeVARCHAR2(15),l_dateVARCHAR2(30));创建触发器:
--创建触发器CREATEORREPLACETRIGGERTEST_TRIGGERAFTERDELETEORINSERTORUPDATEONTESTDECLAREV_TYPETEST_LOG.L_TYPE%TYPE;BEGINIFINSERTINGTHEN--INSERT触发V_TYPE:="INSERT";DBMS_OUTPUT.PUT_LINE("记录已经成功插入,并已记录到日志");ELSIFUPDATINGTHEN--UPDATE触发V_TYPE:="UPDATE";DBMS_OUTPUT.PUT_LINE("记录已经成功更新,并已记录到日志");ELSIFDELETINGTHEN--DELETE触发V_TYPE:="DELETE";DBMS_OUTPUT.PUT_LINE("记录已经成功删除,并已记录到日志");ENDIF;INSERTINTOTEST_LOGVALUES(USER,V_TYPE,TO_CHAR(SYSDATE,"yyyy-mm-ddhh24:mi:ss"));--USER表示当前用户名END;/-执行下面的DML语句。
INSERTINTOtestVALUES(101,"zhao",22,"M");UPDATEtestSETt_age=30WHEREt_id=101;DELETEtestWHEREt_id=101;-检查效果。
SELECT*FROMtest;SELECT*FROMtest_log;运行结果如下:
篇幅有限,今天的内容就到这里吧。稍后我们将分享更多DBA和devops内容。感兴趣的朋友可以关注一下~