2012-11-12 27 views
0

我一直在使用一個專用的服務器上這個MySQL觸發,所以每一個表被更新時,它計算新的總和,並更新另一個表:是否有在存儲過程中該觸發等效

delimiter | 
CREATE TRIGGER after_insert_rep_points AFTER INSERT ON users_reputation 
FOR EACH ROW 
BEGIN 
DECLARE new_total INT(10); 
SELECT SUM(rep_points) INTO new_total FROM users_reputation 
WHERE user_id = NEW.user_id; 
UPDATE users SET rep_total = new_total WHERE user_id = NEW.user_id; 
END 
| 
delimiter ; 

我現在需要在共享主機環境中使用它,但不幸的是,由於安全防範措施,我無法在觸發器所需的共享環境中擁有SUPER USER權限。我不明白這一點。我認爲每個人都應該能夠使用觸發器。

我不是那種在存儲過程中發現的,事實上我沒用,但是我想知道這個查詢是否可以使用一個來執行,如果有的話,任何人都可以給我任何指針嗎?

+0

對不起,你將無法使用你的代碼。 TRIGGER,STORED PROCEDURE和FUNCTION需要創建並執行SUPER USER帳戶。 – sdespont

+0

@sdespont:根據我的託管支持:「允許存在確定性存儲過程/例程,不允許存儲函數和觸發器」。 – ShadowStorm

回答

0

誰寫的觸發器的人顯然具有非常有限的SQL技能 - 整個身體可以表示爲一個簡單的查詢:

UPDATE users SET 
rep_total = (SELECT SUM(rep_points) 
    FROM users_reputation 
    WHERE user_id = users.user_id) 
WHERE user_id = ?; -- "?" is NEW.user_id inside the trigger. You must provide it 

你並不需要一個存儲過程 - 只是運行此查詢。

+0

顯然,使用觸發器的原因是因爲'users_reputation'中有大約60m行,並且它旨在加速獲取SUM並在需要時刪除點。你的答案是否仍然適用於這種情況? – ShadowStorm

+0

閱讀關於觸發器/存儲過程後,我不確定你的答案是否正確。在擁有6千萬行的表上使用觸發器/存儲過程來使用SUM更新另一個表,肯定比運行必須先計數的查詢更快,然後更新?使用觸發器允許我使用一個快速INSERT查詢。你能否確認你的陳述是否正確? – ShadowStorm

+0

我的陳述是「正確的」,但我會解釋。 'rep_total'是每個用戶所有'rep_points'的[非規範化]總數(http://en.wikipedia.org/wiki/Denormalization)。該觸發器會自動保持總數正確 - 只要基礎數據發生變化就會觸發,重新計算總數並更新它。我的查詢完全沒有使用變量(因此不需要存儲過程),但是如果使用的話,只要應用程序更改'users_reputation'中的數據,就必須由應用程序顯式調用(作爲額外的查詢)。總速度只會稍微慢一些。 – Bohemian

相關問題