MySQL で innodb エンジンを使用して、テーブル内の特定の列への挿入または更新を制限する方法はありますか? これらの列をトリガーまたはプロシージャーによってのみ更新したい
私がやりたいのは、これらの列を自動的に計算し、これらを直接変更できないようにすることです。私のアプローチが正しくない場合はお知らせください
私のアプローチが正しくない場合は教えてください
あなたのアプローチは珍しいですが、不可能ではありません。それが「正しい」かどうかは、質問に記載されていない要因によって異なります。
列が常にいくつかの単純な式の結果である場合は、それぞれの式でその式を指定するだけで済みますSELECT
。
SELECT col_a, col_b, LEAST(10*col_a, 5*col_b) AS calculated_column
FROM mytbl
WHERE ...
または、結果をビューに保存して、毎回式を記述する必要がないようにします。
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
を定義できます。
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);
列が実際に定期的に更新されるが、ストアドプロシージャからのみ更新される場合:
列を更新するための既存のユーザーの権限を拒否します。
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 ...