2013-12-16 104 views
0

所以我採取的方法是在用戶表上創建新的布爾列,如果設置爲true,那麼表中有數據,如果爲false,則表爲空。現在我被卡住了,因爲我不知道如何創建觸發器,或者更像觸發器後面的過程。如何檢查用戶是否有某些表中的數據

所以我的邏輯是...爲每個表有一個觸發器:

CREATE TRIGGER check_sales_trigger 
    AFTER INSERT OR DELETE 
    ON sales 
    FOR EACH ROW 
    EXECUTE PROCEDURE check_sales_table(); 

然後,創建一個用戶表更新布爾列每個表的過程。所以基本上我需要幫助創建程序。

僅供參考,每個客戶都有自己的db。

回答

1

函數(這是一個複數)需要處理a)用戶的新訂單,b)現有訂單的用戶ID更改和c)刪除的訂單。編寫觸發器並不難,只需要閱讀手冊。沒有ifs,沒有buts,沒有例外。

由於這是第一次,下面是更復雜的一個例子(因爲它可能會導致死鎖如果寫得不好),讓你開始:

create function check_sales_table__update() returns trigger as $$ 
begin 
    if new.user_id < old.user_id then 
    update users 
     set has_sales = true 
    where id = new.user_id; 
    update users 
     set has_sales = exists (select 1 from sales where user_id = old.user_id) 
    where id = old.user_id; 
    elsif old.user_id < new.user_id then 
    update users 
     set has_sales = exists (select 1 from sales where user_id = old.user_id) 
    where id = old.user_id; 
    update users 
     set has_sales = true 
    where id = new.user_id; 
    end if; 
    return null; 
end; 
$$ language plpgsql; 

(以上假定不爲空當然。)

+0

對不起,我想說插入或刪除後,不更新。所以大部分情況下,new是插入的行,old是表中的最後一行? – user962449

+0

是的。您只需要相應地拆分上述功能。當插入設置爲true時,刪除設置爲存在(...) –

相關問題