簡體   English   中英

Postgres無法創建觸發函數; “ RETURN附近的語法錯誤”

[英]Postgres Fails to create trigger function; 'syntax error near RETURN'

我是postgres新手,想為我的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;**

基本的運行時規范:

使用pgAdmin3在Ubuntu 16.04上的Postgres 9.5

感謝您的時間。

您的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;

更新了插入內容,我認為您實際上需要使用SELECT進行INSERT 試試上面的修改后的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM