如何将mysql中的写入列限制为仅用于过程

如何将mysql中的写入列限制为仅用于过程,mysql,database,triggers,innodb,Mysql,Database,Triggers,Innodb,在MySQL中使用innodb引擎有没有办法限制对表中特定列的插入或更新?我只想通过触发器或过程更新这些列 我想做的是自动计算这些列,而不允许直接更改这些列。如果我的方法不正确,请告诉我 如果我的方法不正确,请告诉我 你的方法不同寻常,但并非不可能。是否“正确”将取决于您问题中未提及的因素: 如果列始终是某个简单表达式的结果,则只需在每个列中指定该表达式: 或者将结果存储在中,这样您就不必每次都编写表达式: CREATE VIEW myview AS SELECT col_a, col_b,

在MySQL中使用innodb引擎有没有办法限制对表中特定列的插入或更新?我只想通过触发器或过程更新这些列

我想做的是自动计算这些列,而不允许直接更改这些列。如果我的方法不正确,请告诉我

如果我的方法不正确,请告诉我

你的方法不同寻常,但并非不可能。是否“正确”将取决于您问题中未提及的因素:

  • 如果列始终是某个简单表达式的结果,则只需在每个列中指定该表达式:

    或者将结果存储在中,这样您就不必每次都编写表达式:

    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 ...
    

@gehad:这完全取决于我试图解决的业务问题……;)我收到SQL错误(1147):没有为表“tbl_order”上主机“localhost”上的用户“root”定义这样的授权。不过,我正在尝试撤消root用户的访问权限。我创建了另一个用户,它成功了fine@gehad:这完全取决于我试图解决的业务问题……;)我收到SQL错误(1147):没有为表“tbl_order”上主机“localhost”上的用户“root”定义这样的授权。不过,我正在尝试撤消root用户的访问权限。我创建了另一个用户,效果很好