【问题标题】:MySQL - 'Updated By' column to automatically update with user who modified the row?MySQL - “更新者”列自动更新修改该行的用户?
【发布时间】:2017-01-11 10:35:30
【问题描述】:

这是我的桌子。

+-------------------+--------------+------+-----+---------+----------------+
| Field             | Type         | Null | Key | Default | Extra          |
+-------------------+--------------+------+-----+---------+----------------+
| ID                | int(11)      | NO   | PRI | NULL    | auto_increment |
| Postcode          | varchar(255) | YES  |     | NULL    |                |
| Town              | varchar(255) | YES  |     | NULL    |                |
| Region            | varchar(255) | YES  |     | NULL    |                |
| Company Name      | varchar(255) | YES  |     | NULL    |                |
| Fee               | double       | YES  |     | NULL    |                |
| Company Benefits  | varchar(255) | YES  |     | NULL    |                |
| Date Updated      | date         | YES  |     | NULL    |                |
| Website           | mediumtext   | YES  |     | NULL    |                |
| Updated By        | varchar(255) | YES  |     | NULL    |                |
| Notes             | varchar(255) | YES  |     | NULL    |                |
| LNG               | varchar(255) | YES  |     | NULL    |                |
| LAT               | varchar(255) | YES  |     | NULL    |                |
+-------------------+--------------+------+-----+---------+----------------+

您可以看到我们有一个“更新者”列。

我怎样才能做到这一点,当用户更新行时,“更新者”列会自动更新(如果是他们正在添加的新行,则插入)当前登录的用户名?

非常感谢

【问题讨论】:

  • 如果您使用会话,则首先获取会话,然后使用该会话更新表
  • 您是指logged-in 用户,database 用户吗?还是应用层的用户?
  • Wajeeh,我的意思是登录用户,每当用户登录时,他们的名字都会出现在“更新者”中,我的用户通过 MS Access 访问数据库(我知道,我也讨厌它。但他们需要它。)但我也有一个他们使用的 webapp,可以编辑数据,因此每次修改/更新条目时让 MySQL 运行某种触发器可能更合适

标签: mysql database


【解决方案1】:

您必须明确确保这一点,并且每当UPDATE 发生时,您需要更新该列,并在下面说明。确保这一点的最佳方法是,只要当前登录用户原则或声明发生UPDATE 记录,就让您的应用程序逻辑填写该列

update tbl1
set ...,
 Updated By = <logged in user name>
where Id = <some val>

【讨论】:

    【解决方案2】:

    您可以在 Update 或 Insert 语句中使用 USER() 或 CURRENT_USER() 来达到所需的效果。
    从我的角度来看 - 唯一一种安全的方法是创建存储过程,为所需的表提供插入或更新。
    确实,这里讨论过这个问题:
    mysql Set default value of a column as the current logged in user

    【讨论】:

    • 谢谢,但是我已经看到了,这里给出的答案是几年前的,对于看似简单的任务以及使用 2 个不同的表来说相当复杂。所以我想知道是否有一种更简单的方法可以在同一个表中完成行更新?
    • 确切的答案是——不可能。但是,如果您创建更新表的存储过程 - 它将带来所需的结果。
    【解决方案3】:

    类似的东西!

    CREATE TRIGGER `updater`.`tableName_BEFORE_INSERT` BEFORE INSERT ON `tableName`
     FOR EACH ROW
     BEGIN
         Set New.Updated_By = current_user();
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-01
      • 2020-12-14
      • 1970-01-01
      • 2011-09-20
      • 2019-12-16
      • 1970-01-01
      相关资源
      最近更新 更多