PL / SQL触发器
触发器是存储程序,当一些事件发生时自动执行或解雇。触发器,事实上,写入响应于以下任一事件要执行的:
数据库操作(DML)语句(DELETE,INSERT,UPDATE或)。
数据库定义(DDL)语句(创建,变更或删除)。
数据库操作(SERVERERROR,登录,注销,启动或关机)。
触发器可以在表,视图,模式或与该事件相关联的数据库中被定义。
触发器的优点
触发器可以用于以下目的被写成:
自动生成一些派生列值
实施参照完整性
事件记录和表访问存储信息
审计
表的同步复制
堂堂安全授权
防止非法交易
创建触发器
创建触发器的语法如下:
CREATE [OR REPLACE ] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF }
{INSERT [OR] | UPDATE [OR] | DELETE}
[OF col_name]
ON table_name
[REFERENCING OLD AS o NEW AS n]
[FOR EACH ROW]
WHEN (condition)
DECLARE
Declaration-statements
BEGIN
Executable-statements
EXCEPTION
Exception-handling-statements
END;
哪里,
CREATE [OR REPLACE] TRIGGER TRIGGER_NAME:创建或使用TRIGGER_NAME替换现有触发器。
{BEFORE | AFTER | INSTEAD OF}:指定当触发将被执行。在INSTEAD OF子句用于在视图中创建触发器。
{INSERT [OR] | UPDATE [OR] |删除}:指定DML操作。
[OF COL_NAME]:指定将被更新的列名。
[开TABLE_NAME]:此指定与触发器关联的表的名称。
[REFERENCING OLD AS o新的为n]:这可以让你参考新旧价值观各种DML语句,如INSERT,UPDATE和DELETE。
[FOR EACH ROW]:指定一个行级触发器,即触发器将每一行受到影响执行。否则,在执行SQL语句,它被称为表级触发器触发将执行一次。
WHEN(条件):此为行提供了条件该触发器将触发。该条款仅适用于行级触发器有效。
例:
首先,我们将使用我们已经创建,并在前面的章节中使用CUSTOMERS表:
Select * from customers; +----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | +----+----------+-----+-----------+----------+
下面的程序创建了客户表,将火INSERT或UPDATE或DELETE Customers表进行操作的行级触发器。该触发器将显示旧值和新值之间的差异薪水:
CREATE OR REPLACE TRIGGER display_salary_changes
BEFORE DELETE OR INSERT OR UPDATE ON customers
FOR EACH ROW
WHEN (NEW.ID > 0)
DECLARE
sal_diff number;
BEGIN
sal_diff := :NEW.salary - :OLD.salary;
dbms_output.put_line('Old salary: ' || :OLD.salary);
dbms_output.put_line('New salary: ' || :NEW.salary);
dbms_output.put_line('Salary difference: ' || sal_diff);
END;
/
当上述代码在SQL提示符执行时,它产生了以下结果:
Trigger created.
在这里,以下两点非常重要,应认真注意的是:
OLD和NEW引用是不可用于表级触发器,而你可以将它们用于记录级别的触发器。
如果您想查询表中相同的触发,那么你应该使用关键字后,由于触发器可以查询表或再次更改后,才初步改变被应用,该表是早在一个一致的状态。
上述触发已经写在这样一种方式,它会之前的任何DELETE火灾或表的INSERT或UPDATE操作,但你可以写在一个或多个操作触发器,例如BEFORE DELETE,这将触发每当一个记录将使用表的DELETE操作被删除。
触发触发器
让我们在CUSTOMERS表执行某些DML操作。这里有一个INSERT语句,这将在表中创建一个新的记录:
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (7, 'Kriti', 22, 'HP', 7500.00 );
当CUSTOMERS表创建一个记录,上面创建触发器display_salary_changes将被解雇,它会显示以下结果:
Old salary: New salary: 7500 Salary difference:
因为这是一个新的记录这么老的工资不提供上述结果即将为空。现在,让我们对CUSTOMERS表进行多了一个DML操作。这里有一个UPDATE语句,这将更新表中的现有记录:
UPDATE customers SET salary = salary + 500 WHERE id = 2;
当一个纪录CUSTOMERS表进行更新,上面创建触发器display_salary_changes将被解雇,它会显示以下结果:
Old salary: 1500 New salary: 2000 Salary difference: 500