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 后触发 的相关文章

  • PostgreSQL:左外连接语法

    我正在使用 PostgreSQL 8 4 6 和 CentOS 5 5 并有一个用户表 select from pref users where id DE2 id first name last name female avatar ci
  • 从表中删除孤儿

    我正在尝试清理一张有很多孤立项目的桌子 我通过查找空值来检查是否与另一个表存在关系来解决此问题 DELETE FROM table1 LEFT JOIN table2 ON table1 ID table2 ID WHERE table2
  • postgres 有 CLOSEST 运算符吗?

    我正在寻找这样的东西 给定一个表格 id number 1 7 2 1 25 3 1 01 4 3 0 查询SELECT FROM my table WHEREnumberCLOSEST 1 将返回第 3 行 我只关心数字 现在我有一个程序
  • sql查询将两列与一列连接起来

    我在 MS Access 2010 中有 2 个表 如下所示 USERS u id u name LOAN l id l from ref users u id l to ref users u id l amount Users u id
  • 如何在 sqlalchemy 中创建基于文字的查询?

    我创建了一个函数来创建表达式 def test operator1 operation operator2 return literal column operator1 op operation operator2 现在当我用 test
  • 使用 MS Access 获取行的第一个实例

    EDITED 我有这个查询 我想SELECT表中记录的第一个实例petTable SELECT id pet ID FIRST petName First Description FROM petTable GROUP BY pet ID
  • 没有运算符与给定名称和参数类型匹配。您可能需要添加显式类型转换。 -- Netbeans、Postgresql 8.4 和 Glassfish

    我正在尝试使用 EclipseLink 在 Glassfish 中使用 JPA 编辑 Postgresql 中的表 当我插入一个实体时 它运行良好 但是 当我尝试编辑或删除同一实体时 它失败并出现以下错误 任何想法 Caused by Ex
  • 是否有可能在 postgres 中捕获外键违规

    我正在尝试将数据插入具有外键约束的表中 如果我插入的行中存在约束违规 我想丢弃该数据 问题是每次我违反约束时 postgres 都会返回一个错误 我是否可以在插入语句中添加一些语句 例如 ON FOREIGN KEY CONSTRAINT
  • SQLite HAVING 比较错误

    我有一个测试 SQLite 表 用于存储带有值的报告数据 CREATE TABLE IF NOT EXISTS test fact daily revenue date TEXT revenue NUMERIC product TEXT I
  • 复选框上的数据绑定

    我目前正在将数据从 SQL 数据库之一提取到我的应用程序中 我可以让它适用于我的文本框和其他项目 但是 我似乎无法让它适用于复选框 这是我正在使用的代码 DataTable dt new DataTable dt using SqlConn
  • 查找 PostgreSQL 中所有范围集合的所有交集

    我正在寻找一种有效的方法来查找时间戳范围集之间的所有交集 它需要与 PostgreSQL 9 2 配合使用 假设这些范围代表一个人可以见面的时间 每个人都可以有一个或多个空闲时间范围 我想找到all可以召开会议的时间段 即所有人都有空的时间
  • 如何在 SQL Server 中使用 nvarchar 变量为 unicode 用户添加前缀“N”?

    如何在 SQL Server 中使用 nvarchar 变量为 unicode 用户添加前缀 N 例如 给定这个变量 declare Query1 nvarchar max 我可以这样分配它 set Query1 N 但是如果我想使用怎么办
  • 更改迁移中的自动​​增量值(PostgreSQL 和 SQLite3)

    我有一个托管在 Heroku 上的项目 想要更改表的自动增量起始值 我在本地使用 SQLite3 Heroku 使用 PostgreSQL 这是我在迁移中所拥有的 class CreateMytable lt ActiveRecord Mi
  • Oracle:使用SQL或PL/SQL查找动态SQL中的错误位置

    如何在 PL SQL 或 SQL 中找到动态 SQL 语句中的错误位置 从 SQL Plus 中 我看到了错误的位置 例如 无效的 SQL DML 语句 SYS orcl gt SELECT 2 X 3 FROM 4 TABLEX 5 TA
  • 如何在不运行 PostgreSQL 服务器的情况下初始化 PostgreSQL 数据库

    在初始化脚本中 我想初始化 PostgreSQL 目录 但在此阶段不需要 也不希望 正在运行的 PostgreSQL 服务器 如果我只是创建集群 作为用户postgres initdb D 但是 我还需要创建 PostgreSQL 角色 创
  • 分层查询

    我希望我能够解释困扰我的问题 我有以下分层数据集 这只是 34K 记录的子集 PARENT ID CHILD ID EXAM TUDA12802 TUDA12982 N TUDA12982 TUDA12984 J TUDA12984 TUD
  • 插入触发器最终在分区表中插入重复行

    我有一个分区表 我认为 适当的INSERT触发器和一些限制 不知何故 INSERT语句为每个语句插入 2 行INSERT 一个用于父分区 一个用于相应的分区 设置简要如下 CREATE TABLE foo id SERIAL NOT NUL
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 了解 SSMS 2008 中关系的更新和删除规则

    当我们定义外键约束时 我对 SQL Server 2008 Management Studio 中的更新和删除规则的含义感到困惑 我也没有找到相关的帮助文档 例如F1帮助 这是屏幕快照 如果有人能描述它们的含义并推荐一些相关文档来阅读 我将
  • 对多个数据库执行 SQL 查询

    我知道我的帖子与该论坛中的其他帖子的标题非常相似 但我真的找不到我需要的答案 这是我的问题 我的 Windows Server 上运行着 SQL Server 在我的 SQL Server 中 我有大约 30 个数据库 它们都具有相同的表和

随机推荐

  • 如何在 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