哈喽小伙伴们 ,今天给大家科普一个小知识。在日常生活中我们或多或少的都会接触到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内容。感兴趣的朋友可以关注一下~

关键词: