2012-11-17 43 views
0

有沒有辦法在MySQL中使用innodb引擎來限制插入或更新到表中的特定列?我只想通過觸發器或程序更新這些列如何限制寫入mysql中的列到只有過程

我想要做的是自動計算這些列,並且不允許直接更改這些列。讓我知道如果我的做法是不正確

回答

3

讓我知道如果我的做法是不正確

你的做法是不尋常的,但並非不可能。無論是「正確的」,將取決於在你的問題沒有提及的因素:

  • 如果列有一些簡單的表達總是結果,你可以簡單地指定每個SELECT那表情:

    SELECT col_a, col_b, LEAST(10*col_a, 5*col_b) AS calculated_column 
    FROM mytbl 
    WHERE ... 
    

    或存儲在view的結果,這樣你就不需要寫表達式(S)每次:

    CREATE VIEW myview AS 
    SELECT col_a, col_b, LEAST(10*col_a, 5*col_b) AS calculated_column 
    FROM mytbl 
    

    在這種情況下,選擇結果一個僅僅需要做的:

    SELECT * FROM myview WHERE ... 
    

    但請注意,calculated_column仍然會每次從視圖中選擇時間評估,因此可能會導致性能問題,如果它是一個複雜的表達式或您的表非常大。相反,如果你想存儲的計算結果(因此它不需要在每個SELECT進行評估),您可以定義triggers所有覆蓋用戶提供的任何值:

    CREATE TRIGGER mytbl_insert AFTER INSERT ON mytbl FOR EACH ROW SET 
        NEW.calculated_column = LEAST(10*NEW.col_a, 5*NEW.col_b); 
    
    CREATE TRIGGER mytbl_update AFTER UPDATE ON mytbl FOR EACH ROW SET 
        NEW.calculated_column = LEAST(10*NEW.col_a, 5*NEW.col_b); 
    
  • 如果列將實際定期更新,但只能從一個存儲過程:

    1. 拒絕您的現有用戶(S)允許更新列:

      REVOKE INSERT (col1, col2), UPDATE (col1, col2) ON mydb.mytbl FROM myuser; 
      

      請注意,如果您的用戶具有表或數據庫級別的權限,則需要撤銷它們並根據需要替換爲列級別的權限。

    2. 創造條件,程序將運行一個用戶:

      GRANT INSERT, UPDATE ON mydb.mytbl TO 
      'procuser'@'nonexistent' IDENTIFIED BY PASSWORD ''; 
      
    3. 定義你的程序,根據該新用戶運行:

      CREATE DEFINER = 'procuser'@'nonexistent' PROCEDURE ... 
      
+0

驚人!非常感謝。你會以哪種方式做到這一點? – gehad

+0

@gehad:這將取決於我試圖解決什麼業務問題...;) – eggyal

+0

我得到SQL錯誤(1147):沒有這樣的授予定義爲用戶'根'在主機'本地主機'在表' tbl_order' – gehad