Postgres 在插入访问 NEW 后触发

2024-04-28

我有一个非常简单的触发器:

CREATE OR REPLACE FUNCTION f_log_datei()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO logs (aktion, tabelle, benutzer_id) VALUES(TG_OP, 'dateien', NEW.benutzer_id);
END; $$ LANGUAGE 'plpgsql';

CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH STATEMENT
EXECUTE PROCEDURE f_log_datei();

我的表日志如下:

CREATE TABLE logs(
    id int PRIMARY KEY DEFAULT NEXTVAL('logs_id_seq'),
    zeit timestamp DEFAULT now(),
    aktion char(6),
    tabelle varchar(32),
    alt varchar(256),
    neu varchar(256),
    benutzer_id int references benutzer(id)
);

在 dateien 中插入一些内容后,出现以下错误:

ERROR:  record "new" is not assigned yet
DETAIL:  The tuple structure of a not-yet-assigned record is indeterminate.
CONTEXT:  SQL statement "INSERT INTO logs (aktion, tabelle, benutzer_id) VALUES(TG_OP, 'dateien', NEW.benutzer_id)"
PL/pgSQL function "f_log_datei" line 3 at SQL statement

为什么我收到此错误?我查看了文档,似乎他们以与我相同的方式使用 new 。


来自精美手册 http://www.postgresql.org/docs/current/interactive/trigger-definition.html:

36.1。触发器行为概述
[...]
对于行级触发器,输入数据还包括NEW行为INSERT and UPDATE触发器,和/或OLD行为UPDATE and DELETE触发器。语句级触发器当前没有任何方法来检查语句修改的各个行。

并从触发程序 http://www.postgresql.org/docs/current/interactive/plpgsql-trigger.html:

NEW
数据类型RECORD;保存新数据库行的变量INSERT/UPDATE行级触发器中的操作。这个变量是NULL在语句级触发器和 forDELETE运营。

请注意它对行级触发器和语句级触发器的说明。

您有一个语句级触发器:

...
FOR EACH STATEMENT
EXECUTE PROCEDURE f_log_datei();

语句级触发器每个语句触发一次,并且一个语句可以应用于多行,因此概念受影响的行(这是什么NEW and OLD是关于)根本不适用。

如果你想使用NEW (or OLD) 在触发器中,那么您希望触发器针对每个受影响的行执行,这意味着您需要一个行级触发器:

CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH ROW
EXECUTE PROCEDURE f_log_datei();

我刚刚改变了FOR EACH STATEMENT to FOR EACH ROW.


你的触发器也应该退货 http://www.postgresql.org/docs/current/interactive/plpgsql-trigger.html:

触发函数必须返回NULL或与触发触发器的表结构完全相同的记录/行值。
[...]
触发的行级触发器的返回值AFTER或触发语句级触发器BEFORE or AFTER总是被忽略;它也可能为空。但是,任何这些类型的触发器仍可能通过引发错误来中止整个操作。

所以你应该RETURN NEW; or RETURN NULL;在你的触发器中。你有一个 AFTER 触发器,所以使用哪个 RETURN 并不重要,但我会选择RETURN NEW;.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Postgres 在插入访问 NEW 后触发 的相关文章

  • 为什么在尝试使用 Java 连接到 RDS PostgreSQL 数据库时会收到 SocketTimeoutException?

    我有一个 Spring 应用程序 我试图在 AWS 上托管 几天来我一直在努力配置 我有一个 EC2 实例 并且能够通过 SSH 连接到它 我还在 AWS 中设置了 Postgres RDS 数据库 但我无法使用 IDE 中的代码连接到它
  • sqlalchemy 的 row_to_json 语法

    我想弄清楚如何将 Postgres 9 2 row to json 与 SqlAlchemy 一起使用 但是我无法想出任何有效的语法 details foo row q select Foo where Foo bar id Bar id
  • 哪种 SQL 模式能够更快地避免插入重复行?

    我知道有两种不重复插入的方法 第一个是使用WHERE NOT EXISTS clause INSERT INTO table name col1 col2 col3 SELECT s s s WHERE NOT EXISTS SELECT
  • SQL分组和总结

    我的表如下所示 income date productid invoiceid customerid 300 2015 01 01 A 1234551 1 300 2016 01 02 A 1234552 1 300 2016 01 03
  • 在tomcat中显示Spring-security的SQL错误

    我使用 spring security 框架创建了一个 Web 应用程序 我设置了一个数据库来存储用户及其角色 但 tomcat 给出以下错误 17 sep 2010 11 56 14 org springframework beans f
  • MySQL:用户对数据库的访问被拒绝

    我正在尝试在 Heroku 上的远程 SQL 服务器上创建一个数据库 clearDB 我与此联系 mysql host lt
  • 为什么 Orchard 在执行内容项查询时如此慢?

    假设我想查询所有 Orchard 用户 ID 并且还想包括那些已被删除 也称为软删除 的用户 该数据库包含大约 1000 个用户 Option A 大约需要 2 分钟 Orchard ContentManagement IContentMa
  • 动态SQL生成列名?

    我有一个查询 我正在尝试将行值转换为列名称 目前我正在使用SUM Case As ColumnName 声明 像这样 SELECT SKU1 SUM Case When Sku2 157 Then Quantity Else 0 End A
  • 如何在查询中生成序列号?

    我们使用 PostgreSQL v8 2 3 如何在查询输出中生成序列号 我想显示查询返回的每一行的序列号 例子 SELECT employeeid name FROM employee 我希望生成并显示从一开始的每一行的序列号 你有两个选
  • 如何重命名 SQL Server 中名称中带有方括号的内容?

    我的一张桌子上有一列 周围有方括号 Book Category 我想重命名为Book Category 我尝试了以下查询 sp rename BookPublisher Book Category Book Category COLUMN
  • 产品和变体 - 设计数据库的最佳方法

    描述 商店可以有产品 鞋子 T 恤等 每个产品可以有许多变体 每个变体可以有不同的价格和库存 例如T 恤有不同的颜色和尺寸 颜色 蓝色 尺寸 L 价格 10 美元 库存 5 颜色 蓝色 尺寸 XL 价格 10 美元 库存 10 颜色 白色
  • 获取 Postgres 数据库中每个表的行数

    获取数据库中所有表的行数的最有效方法是什么 我正在使用 Postgres 数据库 结果示例 table name row count some table 1 234 foobar 5 678 another table 32 如果您想要特
  • 如何使用 OnChange() 触发器

    我有一个电子表格以及该电子表格的主副本 每次用户将数据输入单元格时 它都会获取新数据并放入主副本中 然而最近 我注意到一个用户创建了一个新列 该列未被 OnEdit 捕获 于是我查了一下 看到了去年实现的OnChange 但是 我不知道如何
  • 如何使用 SQL Server 查询对“版本号”列进行排序

    我想知道我们当中的 SQL 天才是否可以向我伸出援助之手 我有一个专栏VersionNo在表中Versions包含 版本号 值 例如 VersionNo 1 2 3 1 1 10 3 1 1 4 7 2 etc 我正在寻找对此进行排序 但不
  • 如何在sql中提取周数

    我有一个 varchar2 类型的转换列 其中包含以下主菜 01 02 2012 01 03 2012 etc 我使用 to date 函数将其转换为另一列中的日期格式 这是我得到的格式 01 JAN 2012 03 APR 2012 当我
  • 如何在数据库中对 (Java) 枚举进行建模(使用 SQL92)

    您好 我正在使用名为 性别 的列对实体进行建模 在应用程序代码中 性别应该是一个 Java 枚举类型 有 2 个值 男性和女性 知道作为数据类型的枚举不是通用 SQL 语言 92 的一部分 您将如何建模它 数据模型必须是可移植的 以便由多个
  • org.postgresql.util.PSQLException:协议错误。会话设置失败

    我知道这些类型的问题已经存在 但提供的解决方案对我不起作用 在我的应用程序中 没有版本不匹配的黑白驱动程序和 PostgreSQL 服务器 我还没有找到任何其他解决方案 我正在使用 PostgreSQL 服务器 9 4 和 postgres
  • 在PostgreSQL中使用查询设置列类型

    优秀后answer https stackoverflow com questions 4336259 how to query the schema details of a table in postgres作者 Alexandre G
  • 如何使用 libpq 获取双精度值?

    The examples http www postgresql org docs 9 3 interactive libpq example htmllibpq 文档中展示了如何通过将整数值转换为主机字节序表示来获取整数值 我很好奇必须做
  • 列的 SQL MAX(包括其主键)

    Short 从下面的 sql select 中 我获取了 cart id 和该购物车中最高价值商品的值 SELECT CartItems cart id MAX ItemValues value FROM CartItems INNER J

随机推荐

  • 如何在 MS Access 中填充字段描述

    当通过 ODBC 尤其是 AS 400 链接到外部数据源时 我经常会在另一端遇到神秘的字段名称 而数据字典不可用 在极少数情况下 我能够从其他数据库获取字段描述 我希望能够一次导入它们 而不是一次将每个描述复制 粘贴到表设计表单中 我无法在
  • 如何从 Twitter 按钮获取“仅推文计数”

    我一直在看http dev twitter com pages tweet button build your own example http dev twitter com pages tweet button build your o
  • 我什么时候应该使用 UdpClient.BeginReceive?我什么时候应该在后台线程上使用 UdpClient.Receive?

    从本质上讲 除了明显的区别之外 它们之间还有哪些区别 我什么时候应该使用哪种形式 class What public Go Thread thread new Thread new ThreadStart Go2 thread Backgr
  • scala:用重载来修饰我的库

    有什么想法为什么以下不起作用 implicit def listExtensions A xs List A new ListExtensions xs class ListExtensions A xs List A def foreac
  • 如何从代理类中检索代理类?

    我将 Hibernate 与代理一起使用 并且获得属于以下类的对象test DBUser EnhancerByCGLIB 40e99a2d 是否有 Hibernate 方法来检索基类 test DBUser在这种情况下 来自代理class
  • 具有更多注入 EJB 实例的无状态 EJB

    我知道无状态 EJB 存储在池中并根据需要进行实例化 我的问题是 当存在更多 EJB 依赖项时会发生什么 例如如下所示 Remote Stateless public class Master EJB EJB private EJB A e
  • Ruby 中 shell 命令的颜色输出

    这是一个简单的 Ruby 脚本 puts ls laG 在 OS X 的 ls 中 G 代表颜色 当在 bash 下运行时 我得到颜色输出 当从 Ruby 脚本运行上述代码时 我在结果输出中看不到颜色或 ANSI 转义序列 根据我所读到的内
  • awk 排序多维数组[重复]

    这个问题在这里已经有答案了 GNU awk 支持多维数组 gnu org software gawk manual gawk Arrays of Arrays q 1 1 dog q 1 2 999 q 2 1 mouse q 2 2 77
  • C# 中如何实现引用返回?

    既然 C GC 可以移动内存 那么如何实现引用返回呢 下面的代码会导致 未定义的行为 吗 public struct Record public int Hash public VeryLargeStruct Data public cla
  • 在 hasRole 中使用 spring:eval

    我在 JSP 中显示属性文件中的某些属性 如下所示
  • 无法在 Struts 中加载配置

    我正在尝试在在线考试中实现 STRUTS Spring 和 HIBERNATE 集成 使用 apache tomcat 7 0 42 在 Eclipse Kepler 中运行项目时 它会抛出以下错误 HTTP Status 404 Onli
  • Typescript深度替换多种类型

    我将 mongodb 与 types mongodb 一起使用 这为我提供了一个很好的 FilterQuery 接口 用于我的 mogodb 查询形状文档集合 在我的域对象类中 我有一些额外的逻辑 例如将日期转换为时刻对象或将浮点数转换为
  • 需要澄清应用程序域

    我需要对这个主题进行一些澄清 因为我刚刚遇到将 swf 加载到重用加载器对象中的问题 假设我有 3 个 SWF 主文件 swfchildA swfchildB swf Main swf 中有一个可重用的加载程序对象 myloader loa
  • 选择项目后 jQuery UI 自动完成触发新事件

    我正在使用 jQuery UI 自动完成 并且尝试实现一些代码 一旦用户从自动完成下拉列表中选择了一个项目 它就会调用另一个函数 我查看了 API 文档 但进展甚微 Call LookUpGroupName ActionResult in
  • 如何从 ext2/ext3 文件系统上的稀疏文件中删除一些块

    当您写入稀疏文件时 ext2 ext3 文件系统会自动分配块 但是当我不再需要其中的某些块时 我发现没有办法做到这一点 感觉就像使用 malloc 而不使用 free 是否可以 释放 稀疏文件的某些块 如果是的话 怎么样 不要告诉我将其复制
  • 本地/离线网站“站点”的全文搜索[重复]

    这个问题在这里已经有答案了 可能的重复 通过 javascript 对 CD Rom 上的静态 HTML 文件进行全文搜索 https stackoverflow com questions 1357173 full text search
  • JavaScript 中的“onclick”和“this”

    我很困惑 为什么内联onclick我们要写onclick hello 而在JS中我们应该写btn onclick hello或者btn addEventListener click hello 对于常规函数 为什么在内联onclick中 t
  • 如何在实体框架中进行“in”查询?

    如何在 linq toEntity 中进行选择以从列表中选择带有键的行 像这样的东西 var orderKeys new int 1 12 306 284 50047 var orders from order in context Ord
  • 创建 JPA 提供者

    有谁知道如何创建自己的 JPA 提供程序 我正在考虑制作一个自定义 JPA 提供程序 它可以与我们使用的 SOAP Web 服务交互 但是 我似乎找不到任何描述如何创建自己的 JPA 提供程序的文档 我应该从哪里开始寻找 你首先要实施jav
  • Postgres 在插入访问 NEW 后触发

    我有一个非常简单的触发器 CREATE OR REPLACE FUNCTION f log datei RETURNS TRIGGER AS BEGIN INSERT INTO logs aktion tabelle benutzer id