人大金仓数据库PLSQL中触发器部分的学习与总结

220 阅读4分钟

关键字:

KingbaseES、plsql、触发器

一、基本概念

触发器是一种特殊的存储过程。但触发器没有输入和输出参数,因此不能被显示调用、它作为语句的执行结果自动引发,二储存过程则是通过储存过程名称被直接调用。

二、功能介绍

2.1 强化约束

可以实现比check语句更为复杂的约束。

触发器可以很方便地引用其他表的列,去进行逻辑上的检查。

触发器在check执行的。

触发器可以插入删除、更新更多行。

2.2 跟踪变化

触发器可以检测数据库内的操作,从而禁止数据库中未经许可的更新和变化

例如:基金涨幅超过一定值,自动提醒管理员,或者自动卖出

2.3 联级运行

触发器可以检测数据库内的操作,自动地联级影响整个数据库的不同表的各项内容。

2.4 调用存储过程

为了响应数据库更新,可以调用一个或多个触发器。

三、触发器的种类和具体使用

3.1 触发器的种类

3.1.1 DML触发器

用户通过数据操作语句DML(对表或视图的insert、delete、update)编辑数据,则执行DML触发器,系统将触发器和触发它的语句作为可在触发器内回滚的单个事务对待,如果检测到错误,则整个事务自动回滚。

3.1.2 DDL触发器

为了响应各种数据定义语言DDL(以CREATE、INSTERT、UPDATE)事件而触发。可以用于在数据库执行管理任务。

3.2 具体使用

3.2.1 before

有一个表goods(id int,good_name varchar)利用触发器实现id自增功能,使插入记录时只提交good_name即可.

创建序列:

file

创建触发器:

file

插入记录:

file

查看结果:

file

3.2.2 after

这类触发器是在记录已经被修改完,事务已被提交后被触发执行。主要记录变更后的处理和检查。一旦发现bug,可以使用ROLLBACK TRANSACTION语句回滚本次操作。

举例: 实现只要表B新增数据,就将该数据新增到备用表A中:

\set SQLTERM /
Create trigger tri after insert on B for each row
Begin
Insert into A(colum_1,colum_2) values (:new.colum_1,new.colum_2);
End;
/

3.2.3 instead of

这类触发器不去执行其定义的操作(insert、update、delete),而是交给触发器执行,触发器检查是否正确,若正确则执行操作。这类触发器用来取代原来的操作,在记录变更之前被触发。

举例: 因为无法直接对视图使用插入记录操作,所以使用instead of触发器实现该操作,插入视图中的记录,改为插入到对应表对应行中。

创建触发器:

file

执行插入操作:

file

查看结果:

Student表中:出现该记录,插入成功。

file

不过视图中未查到该记录:

file

3.3.3 for each row

写入该字段,即启用行级触发器,例如:INSTEAD OF INSERT ON stu_info FOR EACH ROW

反之为,语句级触发器,例如:INSTEAD OF INSERT ON stu_info

行级触发器是指每一条sql语句触发一次;

语句级触发器是指一条sql语句影响的每一行触发一次。

四、问题发现和注意事项

4.1 ksql的部分特性

4.1.1不能对触发器名称进行修改

尝试使用alter trigger [trigger_name]语句对触发器名称进行修改,结果失败。

查看产品手册无相关介绍,请教同事后了解到ksql无修改触发器名称的功能,因为ksql触发器的实际名称含数字后缀。

4.2.2 只能对视图使用instead of触发器,不能对表使用

在3.2.3中已演示对视图的操作,对表进行添加触发器后报错。

4.2.3 系统游标和动态游标的区别

系统游标的主要意义为省去了手动定义动态游标的过程。

举例:

系统游标:

Cur_stu_info sys_refcursor;

相当于动态游标:

Type Cur_stu_type is ref cursor;
Cur_stu_info cur_stu_type;

4.2.4 instead of可否对同一操作建立不同名称的触发器

成功创建

file

插入时遇到唯一约束问题

file

4.2.5 DBMS_OUTPUT.PUT_LINE()问题

在学习plsql过程中,发现DBMS_OUTPUT.PUT_LINE(),不显示输出结果,经外网搜素后得知,需要在先使用sql命令set serveroutput on;打开输出功能。 更多信息,参见help.kingbase.com.cn/v8/index.ht…