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)
我还没有完成列查询的部分,但这很容易。让我们知道这种方法是否适合您。
我的 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)
我还没有完成列查询的部分,但这很容易。让我们知道这种方法是否适合您。