Oracle的触发器和存储过程一样,都是嵌入到Oracle的一段程序。触发器是由事件来触发某个操作,这些事件包括INSERT、UPDATAE和DELETE语句。如果定义了触发程序,当数据库执行这些语句的时候就会激发触发器执行相应的操作,触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。
触发器(trigger)是个特殊的存储过程,不同的是,执行存储过程要使用EXEC语句来调用,而触发器的执行不需要使用EXEC语句来调用,也不需要手工启动,只要当一个预定义的事件发生的时候,就会被Oracle自动调用。
触发器可以查询其他表,而且可以包含复杂的SQL语句。它主要用于满足复杂的业务规则或要求。
1.创建触发器
1.1创建只有一个执行语句的触发器
TRIGGER NAME标识触发器名称,用户自行指定;
trigger time标识触发时机,可以指定为before或after;
trigger_event标识触发事件,包括INSERT、UPDATE和DELETE;
tbl _name 标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt 是触发器程序体。
触发器程序可以使用BEGIN和END作为开始和结束,中间包含多条语句。
1.2创建有多个执行语句的触发器
2.查看触发器
查看触发器是指查看数据库中已存在的触发器的定义、状态和语法信息等。我们可以通过命令来查看已经创建的触发器。
查看触发器的名称,命令如下:
查看INS_SUM触发器的内容信息命令如下:
3.触发器的使用
触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。在某些触发程序的用法中,可用于检查插入到表中的值,或对更新涉及的值进行计算。触发程序与表相关,当对表执行INSERT、DELETE或UPDATE语句时,将激活触发程序。可以将触发程序设置为在执行语句之前或之后激活。例如,可以在从表中删除每一行之前,或在更新每一行之后激活触发程序。
触发器的使用步骤如下:
创建触发器:使用CREATE TRIGGER语句创建触发器,指定触发器的名称、触发时机(BEFORE或AFTER)、触发的数据库操作(INSERT、UPDATE或DELETE)、触发的表名等信息。
定义触发器的触发事件:在触发器中定义触发事件,即当满足一定条件时触发触发器的执行。可以使用IF语句、CASE语句等来定义触发事件。
编写触发器的执行代码:在触发器中编写需要执行的代码,可以是SQL语句、PL/SQL块等。触发器可以访问和修改触发事件所在表的数据。
启用触发器:使用ALTER TRIGGER语句启用触发器,使其生效。
触发器的一些常见应用场景包括:
数据完整性的维护:通过触发器可以在插入、更新、删除数据时进行一些检查,确保数据的完整性,如检查外键约束、检查数据范围等。
数据自动化处理:通过触发器可以实现一些自动化的数据处理操作,如在插入数据时自动生成一些计算字段、在更新数据时自动更新相关字段等。
业务规则的实施:通过触发器可以实现一些业务规则的实施,如在插入、更新、删除数据时触发一些业务逻辑的执行。
需要注意的是,触发器的使用应谨慎,过多或复杂的触发器可能会影响数据库的性能。在设计和使用触发器时,需要考虑数据库的性能和可维护性。
4.修改触发器
要修改Oracle触发器,可以按照以下步骤进行操作:
首先,使用管理员权限登录到Oracle数据库。
使用ALTER TRIGGER语句修改触发器的定义。语法如下:
trigger_name是要修改的触发器的名称。
ENABLE用于启用触发器;
DISABLE用于禁用触发器;
COMPILE用于编译触发器;
RECOMPILE用于重新编译触发器。
如果需要修改触发器的代码逻辑,可以使用CREATE OR REPLACE TRIGGER语句重新定义触发器。语法如下:
trigger_name是要修改的触发器的名称;
table_name是触发器所在的表名;
BEFORE或AFTER关键字用于指定触发器的执行时机;
INSERT、UPDATE或DELETE关键字用于指定触发器的触发事件;
FOR EACH ROW表示触发器对每一行数据都会执行;
DECLARE部分可以用于定义触发器的局部变量。
修改完触发器的定义后,使用COMMIT语句提交修改。
请注意,在修改触发器之前,建议先备份数据库以防止意外情况发生。另外,修改触发器可能会对数据库的正常运行产生影响,建议在非高峰期进行操作,并在修改完成后进行充分的测试。
5.删除触发器
要删除Oracle数据库中的触发器,可以使用以下语法:
其中,是要删除的触发器的名称。
请注意,只有具有足够权限的用户才能删除触发器。
6.注意事项
在使用触发器的时候需要注意,对于相同的表,相同的事件只能创建一个触发器,比如对表account创建了一个BEFORE INSERT触发器,那么如果对表account再次创建一个BEFORE INSERT触发器,Oracle将会报错。此时,只可以在表account上创建AFTER INSERT或者BEFORE UPDATE类型的触发器。灵活地运用触发器将为操作省去很多麻烦。
触发器定义之后,每次执行触发事件,都会激活触发器并执行触发器中的语句。如果需求发生变化,而触发器没有进行相应的改变或者删除,则触发器仍然会执行旧的语句,从而影响新数据的完整性。因此,要将不再使用的触发器及时删除。
领取专属 10元无门槛券
私享最新 技术干货