在某个王国中,在某种状态下……我需要在
pgModeler上的模型上添加一个触发器。 做什么很容易。 但是要添加触发功能...也很简单,但是我不得不处理界面中用于填充/选择的参数。
pgModeler是一个非常好的数据库设计工具,可以为
PostgreSQL生成sql脚本。 有关此工具及其功能的详细信息,请
访问官方
网站 。
例如,考虑具有单个表的简化模型。

向模型添加功能。

此后,将打开一个窗口,其中包含各种可编辑的参数,用于创建该函数。 但是,某些字段已经填充了默认值。

让我们更详细地考虑这些参数。
我认为,有了参数
Name ,
Schema ,
Owner和
Comment,一切都很清楚-这分别是函数的名称,该函数的数据库模式,所有者和注释。
语言是将要执行该功能的语言的名称。 老实说,除了
plpgsql之外,我再也不需要为
PostgreSQL写函数。 因此,正是我选择的参数的这个值。
返回方法 。 由于在触发函数中我们不需要返回表或值集,因此我们保留了
Simple 。
通常,使用“
数据类型”块中的参数,一切也都很简单。 因为 如果在触发器中调用了该函数,则在“
类型”字段中指定
触发器 (“
格式”字段将自动填充
触发器值)。 需要
Dimension字段(此块中唯一的非保留数字字段)来指示返回值数组的尺寸。 但是由于我们只需要一个值,而不是一个数组,因此在此字段中保留
0 。
使用其余参数,至少对于我来说,一切都不那么明显,因为 在
PostgreSQL通常创建函数的过程中,您无需考虑它们。
函数类型可以采用以下三个值之一:
IMMUTABLE ,
STABLE和
VOLATILE 。 从
PostgreSQL官方
文档中,您可以发现这些参数将有关函数的行为通知查询优化器。
- IMMUTABLE表示该函数无法修改数据库,并且对于某些参数值始终返回相同的结果。
- STABLE表示该函数无法修改数据库,并且在单个表扫描中,对于某些参数值,它始终返回相同的结果。
- VOLATILE意味着即使在单个表扫描中,函数的结果也可以更改,因此无法优化其调用。
因此,如果触发功能需要更改数据库,则
IMMUTABLE不适合。 具有
STABLE参数的函数不适用于要读取当前命令修改的行的
AFTER触发器。 仍然存在
VOLATILE ,它没有上述问题。 如果在创建函数时未指定上述任何参数,则默认情况下也会指定它。
安全性可以采用以下两个值之一:
SECURITY DEFINER和
SECURITY INVOKER ,并负责将要调用其用户的权限。
- 安全定义意味着该功能将以拥有该功能的用户的权利执行,即 在所有者上列出的人。
- SECURITY INVOKER意味着该功能将在调用该功能的用户的权利下执行。
默认情况下,使用
SECURITY INVOKER ,因此可以将其保留。
行为可以采用以下三个值之一:
STRICT ,
在NULL输入上返回NULL以及
在NULL输入上返回CALLED,并显示函数在其参数中包含NULL值时的行为。
- 在NULL INPUT或STRICT上返回NULL意味着,如果函数的至少一个参数为NULL,则该函数将始终返回NULL。
- CALLED ON NULL INPUT表示该函数将照常调用,即使NULL是其参数之一。
默认值为
CALLED ON NULL INPUT 。 因此,您可以以相同的方式离开它。
“返回的行数”显示调度程序预期的行数。 为返回集的函数指定该值。 因为 我们的函数返回一个值,我们留下
0 。
执行成本设置为计划程序执行此功能的成本。 对于
plpgsql ,默认值为
100 。 因此,我们指出此值。
Windown Func。 表示将创建一个窗口函数。 就我们而言,因为 我们需要一个触发函数,我们不需要指定此值(通常,他们在文档本身中写道,仅对于用C编写的函数才有意义,请指定此参数)。
防漏表明该功能是密封的,即 除非返回结果,否则它不会公开有关其参数的信息(例如,它不会在错误消息中显示其含义)。 因为 由于触发函数不接受参数,因此无需指定此参数。
因此,该函数的参数已结束。 函数主体本身可以在“定义”选项卡上的同一窗口中编写。 我们继续创建触发器本身。

之后,将显示触发器创建窗口。

考虑可以在此窗口中设置的参数。
再次使用参数
Name ,
Alias和
Comment,一切都变得很清楚-这分别是触发器的名称,别名和触发器的注释。
执行显示了如何执行此触发器,并可以采用以下值之一:
BEFORE ,
AFTER和
INSTEAD OF ,这意味着该函数将在事件发生之前,之后或代替事件执行。
每行确定触发过程是否将为每一行触发一次。 如果未指定,则将设置
FOR EACH STATEMENT参数,该参数确定为SQL语句触发一次触发过程。
事件确定在此触发器中需要处理哪些事件。 您可以指定多个事件。 事件具有以下类型:
INSERT ,
UPDATE ,
DELETE和
TRUNCATE 。 它们在调用具有相同SQL语句的相应命令时发生。
约束指示将创建限制触发器。 违反约束时,约束触发器用于引发异常。 您可以在官方
文档中了解有关它们的更多信息。
对于限制触发,可以指定
Deferrable ,它确定触发时间。 该参数可以采用以下值之一:
INITIALLY IMMEDIATE或
INITIALLY DEFERRED 。
- INITIALLY IMMEDIATE意味着触发器将在每个语句后触发。
- INITIALLY DEFERRED表示触发器仅在事务结束时触发。
请参阅。 Table是约束引用的表的名称。 用于外键约束,并且仅用于约束触发器。
条件是确定是否将执行触发功能的条件。 对于此字段中的
FOR EACH ROW触发器,您可以分别通过
OLD和
NEW来访问旧值和新值(即与触发器函数的主体中的值相同)。
参数 -触发触发器时将传递给触发函数的参数列表。 字符串常量作为参数传递给函数。
列 -只能为
UPDATE事件指定。 仅当
UPDATE中指定的列列表中至少有一个指定列时,该触发器才起作用。
结论
通常,仅此而已。 我希望这很有趣并且对某人有用。
在撰写本文时,使用了在Windows 7 x64下
构建的 pgModeler 0.9.2-alpha版本。 使用较旧/较新版本的pgModeler时,界面上可能会有细微的差异。
本文中使用的模型可以在
此处下载。