mySQL 触发器记录在特殊访问 table 中从 table 访问什么数据的时间和内容

mySQL trigger that notes when and what data is being accessed from a table in a special access table

我的 MySQL 数据库 access & user 中有两个 table。我想创建一个触发器,每次访问用户 table 时都会激活它,并且记录时间戳和所有被请求的列。

例如,如果有人从 user 请求 name,其中 ID=20 那么触发器将在可访问的 table 中创建一个新行,指出 userID, timestamp in unix format, rows column 所以 userID=20, timestamp=1515147950, rowAccessed=name.

这样的触发器大致看起来如何?

编辑:

用户table (InnoDB):

| ID |  name  |    email    | age |
+----+--------+-------------+-----+
| 1  | Alice  | alice@a.com | 20  |
| 2  | Bo b   | bob@b.com   | 12  |
| 3  | Carl   | carl@c.com  | 32  |

访问 table (InnoDB):

| ID | userID |  timeStamp  | column |
+----+--------+-------------+--------+
| 1  |   2    | 1515149281  | name   |
| 2  |   1    | 1515148251  | email  |

access中的数据table就是我希望触发器填写的内容

Access table 中的用户 ID 列通过 InnoDB 关系 table 链接到用户 ID

不用说,您的问题的最佳选择是从代码中处理它。但是如果有必要从 Mysql 开始...这是一种方法,可能行不通,我无法访问 MySQL 来测试它,但这是我的地方将从:

create table user (
  ID int primary key,
  name text,
  email text,
  age int
)


create table access (
  ID int primary key auto_increment,
  userID int,
  time timestamp,
  columnName text
)


insert into user values (1, 'Alice', 'alice@alice.com', 20), (2, 'Bob', 'bob@bob.com', 25)


create procedure selectUser(colName Boolean, colEmail Boolean, colAge Boolean, id INTEGER)
BEGIN
  DECLARE justNow timestamp;
  select now() into justNow;
  IF colName THEN
    insert into access(userID, time, columnName) values (id, justNow, 'name');
  END IF;
  IF colEmail THEN
    insert into access(userID, time, columnName) values (id, justNow, 'email');
  END IF;
  IF colAge THEN
    insert into access(userID, time, columnName) values (id, justNow, 'age');
  END IF;

  SET @s = CONCAT('SELECT name FROM user');
  PREPARE stmt FROM @s;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;

END

call selectUser(true, true, true, 1)

我还没有完成列查询的部分,但这很容易。让我们知道这种方法是否适合您。