【问题标题】:Postgres Fails to create trigger function; 'syntax error near RETURN'Postgres 创建触发器函数失败; '返回附近的语法错误'
【发布时间】:2016-05-29 11:05:10
【问题描述】:

我是一个 postgres 菜鸟,想为我的 admins 表创建一个触发器函数。 我正在关注一个在线示例,检查了类似问题并尝试了各种在线示例,但我仍然卡住了。

我有一张表admins

CREATE TABLE admins (
admin_name      varchar(15) PRIMARY KEY NOT NULL,
password        text NOT NULL,
telephone       varchar(15) NOT NULL UNIQUE,
email           varchar(30) NOT NULL UNIQUE,
added           timestamp DEFAULT CURRENT_TIMESTAMP,
name            varchar(30) NOT NULL,
active          boolean DEFAULT true     
);

还有一个审计表aud_admins

CREATE TABLE aud_admins (
admin_name      varchar(15) PRIMARY KEY NOT NULL,
password        text NOT NULL,
telephone       varchar(15) NOT NULL UNIQUE,
email           varchar(30) NOT NULL UNIQUE,
added           timestamp DEFAULT CURRENT_TIMESTAMP,
name            varchar(30) NOT NULL,
active          boolean DEFAULT true,
updated         timestamp DEFAULT CURRENT_TIMESTAMP,  
func            varchar(15)  NOT NULL     
);
  • 我正在尝试创建一个存储的触发器函数,以便在发生更改但严重失败时更新 aud_admins

这是我的触发函数代码:

CREATE OR REPLACE FUNCTION public.audit_admins()
RETURNS trigger AS
$BODY$
BEGIN 
IF (TG_OP = 'DELETE') THEN
    INSERT INTO aud_admins (admin_name,password,telephone,email,added,name,active,func) VALUES (OLD.admin_name,OLD.password,OLD.telephone,OLD.email,OLD.added,OLD.name,OLD.active,PG_OP)
    RETURN OLD;
ENDIF;
IF (TG_OP = 'INSERT') THEN
     INSERT INTO aud_admins (admin_name,password,telephone,email,added,name,active,func) VALUES (NEW.admin_name,NEW.password,NEW.telephone,NEW.email,NEW.added,NEW.name,NEW.active,PG_OP)
     RETURN NEW;
ENDIF;
IF (TG_OP = 'UPDATE') THEN
    INSERT INTO aud_admins (admin_name,password,telephone,email,added,name,active,func) VALUES (OLD.admin_name,OLD.password,OLD.telephone,OLD.email,OLD.added,OLD.name,OLD.active,PG_OP)
    RETURN NEW;
ENDIF;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;

每次运行都会出现这个错误

**ERROR:  syntax error at or near "RETURN"
  LINE 7:         RETURN OLD;**

基本运行时规范:

Postgres 9.5 开启 Ubuntu 16.04 使用 pgAdmin3

感谢您的宝贵时间。

【问题讨论】:

  • 您的插入语句缺少尾随分号

标签: postgresql triggers ddl


【解决方案1】:

您的INSERT 语句不以分号结尾。尝试更新到以下内容:

IF (TG_OP = 'DELETE') THEN
    INSERT INTO aud_admins (admin_name,password,telephone,email,added,name,active,func) 
    SELECT OLD.admin_name,OLD.password,OLD.telephone,OLD.email,OLD.added,OLD.name,OLD.active,PG_OP;
    RETURN OLD;
END IF;
IF (TG_OP = 'INSERT') THEN
     INSERT INTO aud_admins (admin_name,password,telephone,email,added,name,active,func) 
     SELECT NEW.admin_name,NEW.password,NEW.telephone,NEW.email,NEW.added,NEW.name,NEW.active,PG_OP;
     RETURN NEW;
END IF;
IF (TG_OP = 'UPDATE') THEN
    INSERT INTO aud_admins (admin_name,password,telephone,email,added,name,active,func) 
    SELECT OLD.admin_name,OLD.password,OLD.telephone,OLD.email,OLD.added,OLD.name,OLD.active,PG_OP;
    RETURN NEW;
END IF;

更新了插入,我认为您实际上需要使用INSERT 使用SELECT。试试上面修改过的代码。

【讨论】:

  • 感谢您的快速回复@gmiley,但是当我这样做时,我收到错误ERROR: syntax error at or near "ENDIF" LINE 9: ENDIF;
  • 更改为使用SELECTINSERT。试试看。这将是我能想到的唯一另一件事,根据您遇到的错误判断可能会有所不同。
  • @ianmin2 END IF;,带空格。
  • 很好,不知道我怎么也错过了。有趣的是,有一次我建议切换到CASE 语句,这也可以解决问题。
  • @Abelisto,感谢您的评论,但我意识到我的 postgres 版本甚至可以使用空格。
猜你喜欢
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多