2015-08-08 91 views
1

我已經看遍了所有的網絡和stackoverflow,儘管試圖做我看到的一切,我無法得到它的工作。代碼:PostgreSQL觸發器創建問題

CREATE TABLE "ExpressionHistory" (
ExpressionHistoryId SERIAL PRIMARY KEY, 
ExpressionId INT NOT NULL, 
UserId INT NOT NULL, 
AccessDate TIMESTAMP NOT NULL, 
CreatedBy VARCHAR(12) NOT NULL, 
CreatedDate TIMESTAMP NOT NULL, 
ModifiedBy VARCHAR(12) NOT NULL, 
ModifiedDate TIMESTAMP NOT NULL); 

ALTER TABLE "ExpressionHistory" 
ADD CONSTRAINT FK_EXPRESSIONHISTORY_EXPRESSION 
FOREIGN KEY ("expressionid") 
REFERENCES "Expression"; 

CREATE OR REPLACE FUNCTION prune_expression_history() RETURNS TRIGGER AS $pruned_expression_history$ 
    BEGIN 
     DELETE FROM ExpressionHistory WHERE ExpressionHistoryId = 
      (SELECT ExpressionHistoryId FROM ExpressionHistory WHERE 
      UserId = NEW.UserId AND 
      (SELECT COUNT(1) FROM ExpressionHistory WHERE UserId = NEW.UserId) > 10 
      ORDER BY AccessDate DESC 
      LIMIT 1 OFFSET 10); 
     RETURN NULL; 
    END; 
$pruned_expression_history$ LANGUAGE plpgsql; 

CREATE TRIGGER PruneExpressionHistoryTable 
    AFTER INSERT ON ExpressionHistory 
    FOR EACH ROW 
    EXECUTE PROCEDURE prune_expression_history(); 

錯誤:

ERROR: relation "expressionhistory" does not exist 
********** Error ********** 

ERROR: relation "expressionhistory" does not exist 
SQL state: 42P01 

所以,我們的目標是,在插入這個表,我刪除的10最早的記錄爲用戶在表上的插入發生。我無法觸發實例化,這顯然是一個問題。我懷疑這個問題是微妙的,但我無法孤立它。這發生在CREATE TRIGGER執行中。提前致謝。

+0

http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS –

回答

3

問題是你在混合命名約定。 原理很簡單:雙引號中的標識符區分大小寫;不帶引號的標識符不區分大小寫。 所以ExpressionHistoryexpressionhistory相同,但是"ExpressionHistory"ExpressionHistory不相同。

您需要決定明確的命名約定。大多數Postgres用戶偏好不帶雙引號的標識符(不區分大小寫)。

+0

哇...解決了它。謝謝。 – Rig