在pgModeler中创建一个触发函数

在某个王国中,在某种状态下……我需要在pgModeler上的模型上添加一个触发器。 做什么很容易。 但是要添加触发功能...也很简单,但是我不得不处理界面中用于填充/选择的参数。

pgModeler是一个非常好的数据库设计工具,可以为PostgreSQL生成sql脚本。 有关此工具及其功能的详细信息,请访问官方网站

例如,考虑具有单个表的简化模型。



向模型添加功能。



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



让我们更详细地考虑这些参数。

我认为,有了参数NameSchemaOwnerComment,一切都很清楚-这分别是函数的名称,该函数的数据库模式,所有者和注释。

语言是将要执行该功能的语言的名称。 老实说,除了plpgsql之外,我再也不需要为PostgreSQL写函数。 因此,正是我选择的参数的这个值。

返回方法 。 由于在触发函数中我们不需要返回表或值集,因此我们保留了Simple

通常,使用“ 数据类型”块中的参数,一切也都很简单。 因为 如果在触发器中调用了该函数,则在“ 类型”字段中指定触发器 (“ 格式”字段将自动填充触发器值)。 需要Dimension字段(此块中唯一的非保留数字字段)来指示返回值数组的尺寸。 但是由于我们只需要一个值,而不是一个数组,因此在此字段中保留0

使用其余参数,至少对于我来说,一切都不那么明显,因为 在PostgreSQL通常创建函数的过程中,您无需考虑它们。

函数类型可以采用以下三个值之一: IMMUTABLESTABLEVOLATILE 。 从PostgreSQL官方文档中,您可以发现这些参数将有关函数的行为通知查询优化器。

  • IMMUTABLE表示该函数无法修改数据库,并且对于某些参数值始终返回相同的结果。
  • STABLE表示该函数无法修改数据库,并且在单个表扫描中,对于某些参数值,它始终返回相同的结果。
  • VOLATILE意味着即使在单个表扫描中,函数的结果也可以更改,因此无法优化其调用。

因此,如果触发功能需要更改数据库,则IMMUTABLE不适合。 具有STABLE参数的函数不适用于要读取当前命令修改的行的AFTER触发器。 仍然存在VOLATILE ,它没有上述问题。 如果在创建函数时未指定上述任何参数,则默认情况下也会指定它。

安全性可以采用以下两个值之一: SECURITY DEFINERSECURITY INVOKER ,并负责将要调用其用户的权限。

  • 安全定义意味着该功能将以拥有该功能的用户的权利执行,即 在所有者上列出的人。
  • SECURITY INVOKER意味着该功能将在调用该功能的用户的权利下执行。

默认情况下,使用SECURITY INVOKER ,因此可以将其保留。

行为可以采用以下三个值之一: STRICT在NULL输入上返回NULL以及在NULL输入上返回CALLED,并显示函数在其参数中包含NULL值时的行为。

  • 在NULL INPUTSTRICT上返回NULL意味着,如果函数的至少一个参数为NULL,则该函数将始终返回NULL。
  • CALLED ON NULL INPUT表示该函数将照常调用,即使NULL是其参数之一。

默认值为CALLED ON NULL INPUT 。 因此,您可以以相同的方式离开它。

“返回的行数”显示调度程序预期的行数。 为返回集的函数指定该值。 因为 我们的函数返回一个值,我们留下0

执行成本设置为计划程序执行此功能的成本。 对于plpgsql ,默认值为100 。 因此,我们指出此值。

Windown Func。 表示将创建一个窗口函数。 就我们而言,因为 我们需要一个触发函数,我们不需要指定此值(通常,他们在文档本身中写道,仅对于用C编写的函数才有意义,请指定此参数)。

防漏表明该功能是密封的,即 除非返回结果,否则它不会公开有关其参数的信息(例如,它不会在错误消息中显示其含义)。 因为 由于触发函数不接受参数,因此无需指定此参数。

因此,该函数的参数已结束。 函数主体本身可以在“定义”选项卡上的同一窗口中编写。 我们继续创建触发器本身。



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



考虑可以在此窗口中设置的参数。

再次使用参数NameAliasComment,一切都变得很清楚-这分别是触发器的名称,别名和触发器的注释。

执行显示了如何执行此触发器,并可以采用以下值之一: BEFOREAFTERINSTEAD OF ,这意味着该函数将在事件发生之前,之后或代替事件执行。

每行确定触发过程是否将为每一行触发一次。 如果未指定,则将设置FOR EACH STATEMENT参数,该参数确定为SQL语句触发一次触发过程。

事件确定在此触发器中需要处理哪些事件。 您可以指定多个事件。 事件具有以下类型: INSERTUPDATEDELETETRUNCATE 。 它们在调用具有相同SQL语句的相应命令时发生。

约束指示将创建限制触发器。 违反约束时,约束触发器用于引发异常。 您可以在官方文档中了解有关它们的更多信息。

对于限制触发,可以指定Deferrable ,它确定触发时间。 该参数可以采用以下值之一: INITIALLY IMMEDIATEINITIALLY DEFERRED

  • INITIALLY IMMEDIATE意味着触发器将在每个语句后触发。
  • INITIALLY DEFERRED表示触发器仅在事务结束时触发。

请参阅。 Table是约束引用的表的名称。 用于外键约束,并且仅用于约束触发器。

条件是确定是否将执行触发功能的条件。 对于此字段中的FOR EACH ROW触发器,您可以分别通过OLDNEW来访问旧值和新值(即与触发器函数的主体中的值相同)。

参数 -触发触发器时将传递给触发函数的参数列表。 字符串常量作为参数传递给函数。

-只能为UPDATE事件指定。 仅当UPDATE中指定的列列表中至少有一个指定列时,该触发器才起作用。

结论


通常,仅此而已。 我希望这很有趣并且对某人有用。



在撰写本文时,使用了在Windows 7 x64下构建的 pgModeler 0.9.2-alpha版本。 使用较旧/较新版本的pgModeler时,界面上可能会有细微的差异。

本文中使用的模型可以在此处下载。

Source: https://habr.com/ru/post/zh-CN424121/


All Articles