当前位置:网站首页>PG基础篇--逻辑结构管理(触发器)
PG基础篇--逻辑结构管理(触发器)
2022-07-01 12:42:00 【51CTO】
创建触发器
1)先为触发器建一个执行函数,此函数的返回类型为触发器类型
2)建一个触发器
postgres
=#
create function student_delete_trigger
(
)
postgres
-# returns trigger
as $$
postgres$#
begin
postgres$#
delete
from score
where student_no
=OLD
.student_no
;
postgres$# return OLD
;
postgres$# end
;
postgres$# $$
postgres
-# language plpgsql
;
CREATE FUNCTION
postgres
=#
postgres
=#
create trigger delete_student_trigger
postgres
-# after
delete
on student
postgres
-# for each row execute procedure student_delete_trigger
(
)
;
CREATE TRIGGER
postgres
=#
insert
into student
values
(
1
,
'张三'
,
14
)
;
insert
into student
values
(
2
,
'李四'
,
14
)
;
INSERT
0
1
postgres
=#
insert
into student
values
(
2
,
'李四'
,
14
)
;
INSERT
0
1
postgres
=#
insert
into student
values
(
3
,
'王二'
,
14
)
;
INSERT
0
1
postgres
=#
postgres
=#
insert
into score
values
(
1
,
85
,
75
,
date '2022-06-29'
)
;
INSERT
0
1
postgres
=#
insert
into score
values
(
1
,
80
,
73
,
date '2022-01-29'
)
;
INSERT
0
1
postgres
=#
insert
into score
values
(
2
,
87
,
75
,
date '2022-03-29'
)
;
INSERT
0
1
postgres
=#
insert
into score
values
(
3
,
75
,
75
,
date '2022-06-29'
)
;
INSERT
0
1
postgres
=#
insert
into score
values
(
3
,
55
,
75
,
date '2022-04-29'
)
;
INSERT
0
1
postgres
=#
delete
from student
where student_no
=
3
;
DELETE
1
postgres
=#
select
*
from score
;
student_no
| chinese_score
| math_score
| test_date
------------+---------------+------------+------------
1
|
85
|
75
|
2022
-
06
-
29
1
|
80
|
73
|
2022
-
01
-
29
2
|
87
|
75
|
2022
-
03
-
29
(
3 rows
)
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
语句级触发器
语句级触发器指执行每个sql语句时只执行一次。
create
table log_student
(
update_time
timestamp
,
db_user
varchar
(
40
)
,
opr_type
varchar
(
6
)
)
create
or replace function log_student_trigger
(
)
returns trigger
as $$
begin
insert
into log_student
values
(now
(
)
,user
,TG_OP
)
;
return
null
;
end
;
$$
language
"plpgsql"
;
TG_OP是触发器函数中的特殊变量,代表DML操作类型
create trigger log_student_trigger
after
insert
or
delete
or
update
on student
for statement execute procedure log_student_trigger
(
)
;
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
虽然删了2条记录,但是执行的是一条语句,所以在log_student中只记录了一次操作。
行级触发器
行级触发器执行每行SQL语句都会执行一次
create trigger log_student_trigger2
after
insert
or
delete
or
update
on student
for ROW EXECUTE PROCEDURE log_student_trigger
(
)
;
postgres
=#
insert
into student
values
(
1
,
'张三'
,
14
)
,
(
2
,
'李四'
,
30
)
;
INSERT
0
2
postgres
=#
select
*
from log_student
;
update_time
| db_user
| opr_type
----------------------------+----------+----------
2022
-
06
-
30
10
:
42
:
58.834223
| postgres
|
INSERT
2022
-
06
-
30
10
:
42
:
58.834223
| postgres
|
INSERT
(
2 rows
)
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
可以看到一行sql执行插入2行数据,日志表中记录了2条记录
BEFORE触发器
语句级别的BEFOR触发器是在语句开始做任何事情之前就被触发的
行级别的BEFORE触发器是在对特定行进行操作之前触发的。
AFTER触发器
语句级的AFTER触发器是在语句结束时才触发的
行级别的AFTER触发器是在语句结束时才触发的,它会在任何语句级别的AFTER触发器之前触发。
删除触发器
if exists 如果触发器不存在,发出一个notice而不是一个错误
cascade级联删除依赖此触发器的对象
restrict有依赖的对象就拒绝删除
注意:删除触发器时,触发器的函数不会被删除,不过,删除表时,表上的触发器会被删除。
触发器函数有返回值,语句级触发器应该总是返回NULL,即必选显示的在触发器函数写上return null,否则报错。
边栏推荐
- 硬阈值(Hard Thresholding)函数解读[通俗易懂]
- VS Code 设置单击打开新文件窗口,不覆盖前一个窗口
- The difference between memcpy and strcpy
- [Suanli network] technological innovation of Suanli Network -- key technology of operation service
- Using burpsuite to capture app packages
- 手机便签应用
- Need your own cognition
- 数论基础及其代码实现
- 简单斐波那契(递推)
- 强大、好用、适合程序员/软件开发者的专业编辑器/笔记软件综合评测和全面推荐
猜你喜欢

VS Code 设置单击打开新文件窗口,不覆盖前一个窗口

数据库之MHA高可用集群部署及故障切换

基于.NetCore开发博客项目 StarBlog - (13) 加入友情链接功能

leetcode:241. 为运算表达式设计优先级【dfs + eval】
![79. Word search [DFS + backtracking visit + traversal starting point]](/img/d6/a7693b2af435b7cf4562161ca4bd3f.png)
79. Word search [DFS + backtracking visit + traversal starting point]

Ansible相关内容梳理

Ikvm of toolbox Net project new progress

Use Net core access wechat official account development

logstash报错:Cannot reload pipeline, because the existing pipeline is not reloadable

《MATLAB 神经网络43个案例分析》:第40章 动态神经网络时间序列预测研究——基于MATLAB的NARX实现
随机推荐
木架的场景功能
Like the three foot platform
腾讯安全联合毕马威发布监管科技白皮书,解析“3+3”热点应用场景
【历史上的今天】7 月 1 日:分时系统之父诞生;支付宝推出条码支付;世界上第一支电视广告
Perl 5.10.0 installation package download
路由基础之OSPF LSA详细讲解
Accept different views with an open mind
The sky is blue and misty
Share several tools for designing exquisite circuit diagrams
类的初始化与实例化
Operations related to sequence table
关于NAND FLASH解扣的认识
Zero copy technology of MySQL
[Suanli network] technological innovation of Suanli Network -- key technology of operation service
CS5268优势替代AG9321MCQ Typec多合一扩展坞方案
leetcode:329. The longest incremental path in the matrix [DFS + cache + no backtracking + elegance]
Nc100 converts strings to integers (ATOI)
有人碰到过这种情况吗,oracle logminer 同步的时候,clob字段的值丢失
Need your own cognition
微信模拟地理位置_伪装微信地理位置