2016-12-26 101 views
0

我有一個Web應用程序,在重要表中有一個modified字段,以便在任何修改完成後能夠跟蹤回來。 (心中永遠的;;那是因爲這個Postgres的SQL代碼是從使用;作爲分隔符Scala的框架,執行和;;逃脫它)Postgres觸發器會在任何情況下設置修改值?

CREATE TABLE security_permission (
    id BIGSERIAL, 
    value VARCHAR(255) NOT NULL, 
    modified TIMESTAMP DEFAULT now(), 
    PRIMARY KEY (id) 
); 

CREATE OR REPLACE FUNCTION update_modified() 
RETURNS TRIGGER AS $$ 
BEGIN 
    NEW.modified = now();; 
    RETURN NEW;; 
END;; 
$$ language 'plpgsql'; 

CREATE TRIGGER update_modified_security_permission BEFORE UPDATE ON security_permission FOR EACH ROW EXECUTE PROCEDURE update_modified(); 

問題是這樣的工作只有在字段不指定在插入/更新語句中。如果甚至用NULL指定該字段,則未修改該修改。我沒有完全控制生成的語句,因爲它們是自動生成它們的ORM框架的一部分,但我總是想設置修改的字段。我怎樣才能做到這一點?

我嘗試過使用BEFORE INSERT OR UPDATE ONAFTER INSERT OR UPDATE ON,但是如果在插入/更新語句中填充字段(即使爲NULL),也沒有任何結果。我怎樣才能做到這一點?

+2

定義觸發爲'更新或insert'之前。 [在這裏看到一個工作示例。](http://rextester.com/GTROVA13573) – klin

+0

你能否做出答案?非常感謝! –

回答

1

定義觸發作爲before update or insert

CREATE TRIGGER update_modified_security_permission 
BEFORE UPDATE OR INSERT ON security_permission 
FOR EACH ROW EXECUTE PROCEDURE update_modified(); 

See a working example here.

相關問題