问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

计算机mysql触发器中创建触发器里面监视的table和下面的new或者是old...

发布网友 发布时间:2022-05-07 13:22

我来回答

1个回答

热心网友 时间:2022-05-07 16:42

建立两个单域的表格。一个表格中为姓名列表(表格名:data)。
另一个表格中是所插入字符的字符数(表格名:chars)。在data表格中定义一个触发器。
每次在其中插入一个新姓名时,chars表格中运行的总数就会根据新插入记录的字符数目进行自动更新。
(见列表A)
mysql> CREATE TABLE data (name VARCHAR(255));
Query OK, 0 rows affected (0.09 sec)
mysql> CREATE TABLE chars (count INT(10));
Query OK, 0 rows affected (0.07 sec)
mysql> INSERT INTO chars (count) VALUES (0);
Query OK, 1 row affected (0.00 sec)
mysql> CREATE TRIGGER t1 AFTER INSERT ON
data FOR EACH ROW UPDATE chars SET count = count + CHAR_LENGTH(NEW.name);
Query OK, 0 rows affected (0.01 sec)
列表A
理解上面代码的关键在于CREATE TRIGGER命令,被用来定义一个新触发器。这个命令建立一个新触发器,假定的名称为t1,每次有一个新记录插入到data表格中时,t1就被激活。
在这个触发器中有两个重要的子句:
AFTER INSERT子句表明触发器在新记录插入data表格后激活。
UPDATE chars SET count = count + CHAR_LENGTH(NEW.name)子句表示触发器激活后执行的SQL命令。在本例中,该命令表明用新插入的data.name域的字符数来更新 chars.count栏。这一信息可通过内置的MySQL函数CHAR_LENGTH()获得。
放在源表格域名前面的NEW关键字也值得注意。这个关键字表明触发器应考虑域的new值(也就是说,刚被插入到域中的值)。MySQL还支持相应的OLD前缀,可用它来指域以前的值。
可以通过调用SHOW TRIGGER命令来检查触发器是否被激活,如列表B所示。
mysql> SHOW TRIGGERS\G
*************************** 1. row ***************************
?Trigger: t1
?Event: INSERT
?Table: data
Statement: UPDATE chars SET count = count + CHAR_LENGTH(NEW.name)
Timing: AFTER
?Created: NULL
ql_mode:
1 row in set (0.01 sec)
列表B
激活触发器后,开始对它进行测试。试着在data表格中插入几个记录:
mysql> INSERT INTO data (name) VALUES ('Sue'), ('Jane');
Query OK, 2 rows affected (0.00 sec)
Records: 2?Duplicates: 0?Warnings: 0
然后检查chars表格看触发器是否完成它该完成的任务:
mysql> SELECT * FROM chars;
+-------+
| count |
+-------+
| 7|
+-------+
1 row in set (0.00 sec)
data表格中的INSERT命令激活触发器,计算插入记录的字符数,并将结果存储在chars表格中。如果往data表格中增加另外的记录,chars.count值也会相应增加。
触发器应用完毕后,可有DROP TRIGGER命令轻松删除它。
mysql> DROP TRIGGER t1;
Query OK, 0 rows affected (0.00 sec)
注意:理想情况下,你还需要一个倒转触发器,每当一个记录从源表格中删除时,它从字符总数中减去记录的字符数。这很容易做到,你可以把它当作练习来完成。提示:应用BEFORE DELETE ON子句是其中一种方法。
现在,要建立一个审计记录来追踪对这个表格所做的改变。这个记录将反映表格的每项改变,并向用户说明由谁做出改变以及改变的时间。需要建立一个新表格来存储这一信息(表格名:audit),如下所示。(列表C)
mysql> CREATE TABLE audit (id INT(7), balance FLOAT, user VARCHAR(50)
NOT NULL, time TIMESTAMP NOT NULL);
Query OK, 0 rows affected (0.09 sec)
列表C
接下来,我将在accounts表格中定义一个触发器。(列表D)
mysql> CREATE TRIGGER t1 AFTER UPDATEON accounts
FOR EACH ROW INSERT INTO audit (id, balance, user, time)
VALUES (OLD.id, NEW.balance, CURRENT_USER(), NOW());
Query OK, 0 rows affected (0.04 sec)
列表D
要是已经走到这一步,就很容易理解。accounts表格每经历一次UPDATE,触发器插入(INSERT)对应记录的id、新的余额、当前时间和登录audit表格的用户的名称。
实现中的例子:用触发器审计记录
既然了触发器的基本原理,来看一个稍稍复杂的例子。常用触发器来建立一个自动“审计记录”,以记录各种用户对数据库的更改。为了解审计记录的实际应用,请看下面的表格(表格名:accounts),它列出了一个用户的三个银行账户余额。(表A)
mysql> SELECT * FROM accounts;
+----+------------+---------+
| id | label| balance |
+----+------------+---------+
|1 | Savings #1 |500 |
|2 | Current #1 |2000 |
|3 | Current #2 |3500 |
+----+------------+---------+
3 rows in set (0.00 sec)
表A
然后,检查触发器是否被激活:
mysql> SHOW TRIGGERS \G
*************************** 1. row ***************************
?Trigger: t1
?Event: UPDATE
?Table: accounts
Statement: INSERT INTO audit (id, balance, user, time)
VALUES (OLD.id, NEW.balance, CURRENT_USER(), NOW())
Timing: AFTER
?Created: NULL
Sql_mode:
1 row in set (0.01 sec)
再来看最后的结果(列表E):
mysql> UPDATE accounts SET balance = 500 WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1?Changed: 1?Warnings: 0
mysql> UPDATE accounts SET balance = 900 WHERE id = 3;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1?Changed: 1?Warnings: 0
mysql> UPDATE accounts SET balance = 1900 WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1?Changed: 1?Warnings: 0
列表E
注意,对accounts表格所作的改变已被记录到audit表格中,将来如果出现问题,可以方便地从中进行恢复。
mysql> SELECT * FROM audit;
+------+---------+----------------+---------------------+
| id| balance | user| time|
+------+---------+----------------+---------------------+
|1 |500 | root@localhost | 2006-04-22 12:52:15 |
|3 |900 | root@localhost | 2006-04-22 12:53:15 |
|1 |1900 | root@localhost | 2006-04-22 12:53:23 |
+------+---------+----------------+---------------------+
3 rows in set (0.00 sec)追问那是否监视的表中的其他字段就不能在begin...end 里面再update了?

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
天秤男吃醋的八大表现 天秤座男生吃醋时的表现 人工授精之后注意什么 人授后需要卧床休息吗 ...经两个月没发工资了,我不想干了,老板不给钱怎么办? 新手玩《兰斯10》这款游戏的快速通关攻略是什么? 兰斯10怎么用食券快速刷SSR 兰斯10二周目7cp怎么达成 兰斯10大侵攻达成条件介绍 跳舞同手同脚叫什么来着 喷油嘴清洗机主要功能 为什么在数据库mysql中创建触发器前要先写删除触发器的语句?不这样做有... 主持人任鲁豫身高体重 陈鲁豫是回族吗 主持人鲁豫身高体重 鲁豫身高体重 主持人任鲁豫身高体重多少 鲁豫体重多少 鲁豫的身高和体重 陈鲁豫体重个人资料 陈鲁豫身高体重 主持人陈鲁豫身高体重 主持人鲁豫的身高体重 陈鲁豫为什么那么瘦 鲁豫体重多少斤 鲁豫有多少斤?身高多少? 在深圳怎么用手机乘坐公交车和地铁 我发的朋友圈内容不见了 儿童喝特仑苏纯牛奶好不好 宝宝多大能喝特仑苏纯牛奶 特仑苏有机纯牛奶与雀巢爱思培学生奶粉哪个更好 特仑苏有机奶适合十岁的儿童喝吗? 《美人无泪之宸妃传》txt下载在线阅读全文,求百度网盘云资源 小说美人无泪之宸妃传,海兰珠是什什么时候遇到如莹的 为什么山河恋和小说美人无泪之宸妃传里好多情节一模一样 求皇太极和海兰珠的小说 美人无泪之宸妃传和电视剧是什么关系 求!男主先爱上女主,女主后来才爱上男主的小说 求小说名多尔衮和皇太极同时喜欢上海兰珠的小说 牙疼,漏神经了怎么办? 牙疼 漏神经了怎么办。? 牙疼怎么办?牙有洞漏神经了很疼, 牙疼漏神经怎么办,现在不能拔,怎么能立刻止疼 身份证到期了怎么办理 牙疼.露神经了怎么办 如果牙神经外漏牙疼怎么办 牙齿漏神经了这两天特别痛,该怎么办 牙疼大牙,lo露神经了,特疼怎么办 蛀牙已经漏神经了牙疼怎么能立刻止疼 牙疼,可能是漏神经了,请问吃些什么药 你好,我现在在上班 牙疼的厉害 应该是漏神经了 有没有什么止疼的办法 牙疼的不行,可能漏神经了,怎样暂时止痛