【问题标题】:Get current updated column name to use in a trigger获取当前更新的列名以在触发器中使用
【发布时间】:2010-06-09 18:21:01
【问题描述】:

有没有办法实际获取已更新的列名以便在触发器中使用它?

基本上,每当用户插入或更新表时,我都会尝试进行审计​​跟踪(在这种情况下,它与联系人表有关)

CREATE TRIGGER `after_update_contact`
    AFTER UPDATE ON `contact` FOR EACH ROW
    BEGIN
        INSERT INTO user_audit (id_user, even_date, table_name, record_id, field_name, old_value, new_value)
        VALUES (NEW.updatedby, NEW.lastUpdate, 'contact', NEW.id_contact, [...])
    END

如何获取已更新列的名称并从中获取该列的 OLDNEW 值。如果连续更新了多列甚至多行,是否可以对每次更新进行审核?

【问题讨论】:

    标签: mysql sql triggers


    【解决方案1】:

    试试这个代码...

    create table sales (
      orderno INT, 
      sale INT,
      empsalary int,
      ts TIMESTAMP
    );
    
    create table history (
      updated varchar(20),
      oldvalue INT,
      newvalue INT
    );
    
    INSERT INTO sales 
      (orderno, sale, empsalary) 
    VALUES
      (1,700,7000),
      (2,800,8000),
      (3,900,9000);
    
    DROP TRIGGER test.instrigger;
    
    DELIMITER ///
    
    CREATE TRIGGER test.instrigger
    AFTER UPDATE ON sales
    FOR EACH ROW
    
    BEGIN
    
        IF NEW.sale <> OLD.sale THEN  
            INSERT INTO history
              (updated, oldvalue, newvalue) 
            VALUES
              ('sale', OLD.sale,NEW.sale);
        END IF;
      
        IF NEW.empsalary <> OLD.empsalary THEN  
            INSERT INTO history
              (updated, oldvalue, newvalue)
            VALUES
              ('empsalary', OLD.empsalary,NEW.empsalary);
        END IF;
    END;
    ///
    
    DELIMITER ;
    

    【讨论】:

      【解决方案2】:

      只需对每列使用 OLD.colname NEW.colname 来检查并找到不同的列。触发器在 MySQL 中的使用有点受限,太糟糕了。

      【讨论】:

      • 除非我误解了你的意思,否则我不太确定这对我有什么帮助,我事先不知道要更新哪一列,所以我无法在触发器中对其进行硬编码。我需要找出已更新的列并将其名称插入审计表中。
      • 所以你必须检查所有列。正如我告诉过你的,MySQL 中的触发器非常有限。
      • 我很害怕......所以如果我的表有 5 列,我需要使用 if 语句以及每个列的 INSERT 以便审核每个更新的列?
      • 有没有办法通过名称访问NEW 的属性?我正在寻找类似NEW.[SELECT name FROM pragma_table_info("&lt;table&gt;")] 的东西。更好:SELECT NEW.[t.name], OLD.[t.name] FROM pragma_table_info("&lt;table&gt;")] AS t WHERE NEW.[t.name] &lt;&gt; OLD.[t.name]。有什么办法吗?
      猜你喜欢
      • 2016-05-02
      • 2013-05-25
      • 2019-06-24
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 2019-08-16
      相关资源
      最近更新 更多