PL/SQL 触发器的组成部分2025年4月6日 | 阅读 9 分钟 在本文中,我们将详细了解 PL/SQL 触发器的组成部分的概念。 引言数据库触发器是命名的 PL/SQL 块,它们响应于事件(例如对数据库表执行的 INSERT、UPDATE 和 DELETE)而自动执行。 在开始为触发器编写代码之前,您必须确定触发器组件可以具有的值。 以下是触发器的四个组成部分:
触发时间触发时间有助于确定触发器相对于触发事件的触发时间。触发时间的可能值是:
Before 触发器 触发器在对表触发数据操作事件之前执行触发器主体。它主要用于检查触发语句是否能够完成。它使您可以删除不需要的处理触发语句,并在触发操作中引发异常的情况下回滚。它还用于检索特定的列值,例如主键值,以及在触发 INSERT 或 UPDATE 语句之前检查复合业务顺序。它可以应用于行和语句触发器。 以下是 Before 触发器的示例。 首先,在数据库中创建一个名为 Emp_Details 的表,用于存储员工的详细信息。此表将包含三列,如下所示:ID、Name 和 Job。 现在插入数据。 现在将数据插入到 Emp_Details 表中。每个 INSERT 语句都会创建一个具有员工信息的新行。 显示所有行以检查插入的数据,从 Emp_Details 表中选择所有行。SELECT * 语句显示给定表的所有内容。 输出
创建一个触发器,该触发器将针对 EMP_Details 表上 name 和 job 列发生的每个 INSERT 或 UPDATE 触发。 说明 上面的代码可以这样执行: 如果代码不包含错误,它将显示消息“Trigger Created”,如果代码包含错误,它将显示消息:警告:“Trigger created with compilation errors”。 您可以使用以下命令检查这些错误: 然后删除错误后,保存更改并再次运行它,以便创建触发器而不会出错。 现在,如果我们要向 Emp_Details 表中插入一条新记录,我们将编写: 现在,在正确执行该语句后,将触发一个 Emp_Upper 触发器,该触发器将在执行 INSERT 语句之前被触发,因为我们使用了 BEFORE INSERT 触发器。因此,在插入到 Emp_Details 表之前,oracle 引擎将首先触发触发器,导致先执行触发器操作,即它将用户输入的 name 和 job 列的小写值转换为大写。 类似地,如果要对 Emp_Details 表执行任何 UPDATE 语句,则将触发 BEFORE UPDATE ROW 触发器,然后使用 Select * from Emp_Details 语句查看所做的更新。在这里,您将发现 name 和 job 列将具有大写字符。
后置触发器 触发器在对表触发数据操作事件后执行触发器主体。它主要用于触发语句必须在触发器操作可以执行之前完成的情况。它可以应用于行和语句触发器。After ROW 触发器主要用于审计应用程序,因为它们直到行被修改后才触发。 以下是 After 触发器的示例。 创建一个触发器,当 Dept_tbl 表中的 dno 值发生变化时,更新 EMP_Details 表中相应行的值。 说明 上面的代码可以这样执行: 因此,每当我们更新 DEPT 表中的“deptno”时,就会触发该触发器,并且 Emp_Details 中也会进行相应的更改。此示例显示了触发器强制执行引用完整性。 Instead of 触发器 Instead of 触发器是数据操作触发器的重要选项。当执行 Inserts、Updates 和 Deletes 操作时,它们会被触发。代码解释了在这些 DML 操作之外要做什么。这种类型的触发器控制对视图的操作。这些可用于覆盖可更新视图的行为,并使不可更新视图可更新。它们用于提供一种明确的方式来修改无法通过 SQL DML 语句直接更改的视图。它们被称为 INSTEAD OF 触发器,因为与其它触发器相反,Oracle 服务器触发触发器,而不是执行触发语句。 下面给出了“Instead of 触发器”的示例 首先在数据库中创建一个名为 EMP_VIEW 的视图,用于存储员工的数据。此表将包含两列:id、来自 EMP_Details 表的名称。 检索所有行以检查插入的数据,从 EMP_VIEW 视图中选择所有行。SELECT * 语句显示了表的所有内容。 输出
创建一个触发器,该触发器将针对 EMP_VIEW 视图上 name 和 job 列发生的每个 INSERT 触发。 现在,如果我们要向 EMP_VIEW 视图中插入一条新记录,我们将编写: 我们将使用以下查询检查插入的数据。 输出
触发事件触发事件是导致 Oracle 执行触发器的语句。此事件可以是数据操作语句:对表进行 Insert、Update 和 Delete,对任何模式对象进行数据定义语句等。 在上面的语法中,{ INSERT |DELETE | UPDATE } 指定触发器适用的 DML 操作类型。如果触发事件是 UPDATE 语句,您可以指定必须更新的列才能执行触发器。在触发器中使用列名有助于提高 UPDATE 子句的性能,因为触发器仅在该特定更新发生时触发,从而避免在更新另一个列时发生不必要的触发,但是您无法为 DELETE 或 INSERT 语句描述列列表,因为它们始终对整个行产生影响。 引用子句描述关系的名称。当 PL/SQL 块和行子句触发器专门引用当前行的旧值和新值时,可以使用它。默认关系名称为 old 和 new。 触发限制触发器限制表示一个布尔表达式,该表达式对于执行触发器应为真。它使用 WHEN 子句标识,该子句允许您指定逻辑以避免不必要地执行触发器。这有助于确定是为触发语句影响的每一行执行触发器一次,还是无论影响的行数如何都执行触发器。 它使用以下语法指定 在上面的语法中,<trigger_condition> 是布尔表达式。 如果为每一行指定,则触发器将针对该语句处理的每一行触发。如果省略此子句,则默认行为是仅执行该语句一次,即语句级触发器。 当您使用 WHEN 子句时,适用以下几点
触发器限制有两种类型
行触发器 每当数据操作操作的执行影响一行时,就会触发行触发器。这些触发器是最常见的触发器类型,通常用于数据审计应用程序。它们通过 CREATE TRIGGER 命令中的 FOR EACH ROW 子句进行标识。 例如 让我们举个例子,如果 UPDATE 语句更新了表的 10 行,则行触发器将触发 10 次,即每次更新语句影响一行。如果触发语句没有影响任何行,则根本不会触发行触发器。只有行触发器才能访问受影响记录中的数据值。如果触发器操作取决于受影响行中存在的数据或触发事件提供的数据,这将非常有用。 语句触发器 语句触发器是创建触发器的默认类型。这些通过省略 CREATE TRIGGER 命令中的 FOR EACH ROW 子句来识别。 它仅针对触发语句执行一次。即使没有影响任何行,它也会触发。因此,语句触发器主要不用于大多数数据相关的活动。在大多数情况下,它们用于对可以在表上执行的事务类型强制执行额外的安全措施。 例如:如果触发器对当前用户执行复杂的安全检查。 类似地,如果 UPDATE 语句更新了表的 10 行,则语句触发器将仅运行,无论表中更新了多少行。 触发器的限制
触发操作触发器操作是触发器的主体。当发出正确的触发语句并且触发器限制(如果存在)评估为 TRUE 时,PL/SQL 将执行此块。 语法 说明 在上面的语法中,声明部分是用于声明局部变量和常量的可选部分。begin 部分是强制性的,并且它应该至少有一个语句。Exception 部分是可选的,用于处理在可执行部分中引发的异常。end 语句用于结束触发器。您可以选择使用 end 语句指定触发器名称以显示哪个触发器已终止。 在行触发器中访问旧的和新的伪记录值当实现行触发器时,PL/SQL 运行时引擎会创建并初始化两个伪记录。 伪记录列表如下所示
在使用 OLD 和 NEW 伪记录时,使用以下要点。
下一主题PL/SQL IF |
我们请求您订阅我们的新闻通讯以获取最新更新。