如何将mysql中的写入列限制为仅用于过程
在MySQL中使用innodb引擎有没有办法限制对表中特定列的插入或更新?我只想通过触发器或过程更新这些列 我想做的是自动计算这些列,而不允许直接更改这些列。如果我的方法不正确,请告诉我 如果我的方法不正确,请告诉我 你的方法不同寻常,但并非不可能。是否“正确”将取决于您问题中未提及的因素:如何将mysql中的写入列限制为仅用于过程,mysql,database,triggers,innodb,Mysql,Database,Triggers,Innodb,在MySQL中使用innodb引擎有没有办法限制对表中特定列的插入或更新?我只想通过触发器或过程更新这些列 我想做的是自动计算这些列,而不允许直接更改这些列。如果我的方法不正确,请告诉我 如果我的方法不正确,请告诉我 你的方法不同寻常,但并非不可能。是否“正确”将取决于您问题中未提及的因素: 如果列始终是某个简单表达式的结果,则只需在每个列中指定该表达式: 或者将结果存储在中,这样您就不必每次都编写表达式: CREATE VIEW myview AS SELECT col_a, col_b,
- 如果列始终是某个简单表达式的结果,则只需在每个列中指定该表达式:
或者将结果存储在中,这样您就不必每次都编写表达式:
在这种情况下,要选择结果,只需执行以下操作: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 ...
仍将在每次从视图中选择时进行计算,因此如果它是一个复杂的表达式或表很大,则可能会导致性能问题。相反,如果您希望存储计算结果(这样就不需要对每个computed\u列
选择
)进行计算),您可以定义覆盖用户提供的任何值:
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 ...
- 如果列始终是某个简单表达式的结果,则只需在每个列中指定该表达式:
或者将结果存储在中,这样您就不必每次都编写表达式:
在这种情况下,要选择结果,只需执行以下操作: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 ...
仍将在每次从视图中选择时进行计算,因此如果它是一个复杂的表达式或表很大,则可能会导致性能问题。相反,如果您希望存储计算结果(这样就不需要对每个computed\u列
选择
)进行计算),您可以定义覆盖用户提供的任何值:
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 ...