Postgres 创建触发器函数失败; 'syntax error near RETURN'
Postgres Fails to create trigger function; 'syntax error near RETURN'
我是一个 postgres 菜鸟,想为我的管理员创建一个触发器函数 table。
我正在关注一个在线示例,检查了类似问题并尝试了各种在线示例,但我仍然卡住了。
我有一个 table 管理员
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
);
和审核tableaud_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 table 只要有变化但失败得很惨
这是我的触发函数代码:
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 on
Ubuntu 16.04
with pgAdmin3
感谢您的宝贵时间。
您的 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
。试试上面修改后的代码。
我是一个 postgres 菜鸟,想为我的管理员创建一个触发器函数 table。 我正在关注一个在线示例,检查了类似问题并尝试了各种在线示例,但我仍然卡住了。
我有一个 table 管理员
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
);
和审核tableaud_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 table 只要有变化但失败得很惨
这是我的触发函数代码:
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 on Ubuntu 16.04 with pgAdmin3
感谢您的宝贵时间。
您的 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
。试试上面修改后的代码。