有沒有辦法在MySQL中使用innodb引擎來限制插入或更新到表中的特定列?我只想通過觸發器或程序更新這些列如何限制寫入mysql中的列到只有過程
我想要做的是自動計算這些列,並且不允許直接更改這些列。讓我知道如果我的做法是不正確
有沒有辦法在MySQL中使用innodb引擎來限制插入或更新到表中的特定列?我只想通過觸發器或程序更新這些列如何限制寫入mysql中的列到只有過程
我想要做的是自動計算這些列,並且不允許直接更改這些列。讓我知道如果我的做法是不正確
讓我知道如果我的做法是不正確
你的做法是不尋常的,但並非不可能。無論是「正確的」,將取決於在你的問題沒有提及的因素:
如果列有一些簡單的表達總是結果,你可以簡單地指定每個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);
如果列將實際定期更新,但只能從一個存儲過程:
拒絕您的現有用戶(S)允許更新列:
REVOKE INSERT (col1, col2), UPDATE (col1, col2) ON mydb.mytbl FROM myuser;
請注意,如果您的用戶具有表或數據庫級別的權限,則需要撤銷它們並根據需要替換爲列級別的權限。
創造條件,程序將運行一個用戶:
GRANT INSERT, UPDATE ON mydb.mytbl TO
'procuser'@'nonexistent' IDENTIFIED BY PASSWORD '';
定義你的程序,根據該新用戶運行:
CREATE DEFINER = 'procuser'@'nonexistent' PROCEDURE ...
驚人!非常感謝。你會以哪種方式做到這一點? – gehad
@gehad:這將取決於我試圖解決什麼業務問題...;) – eggyal
我得到SQL錯誤(1147):沒有這樣的授予定義爲用戶'根'在主機'本地主機'在表' tbl_order' – gehad