首页 > 试题广场 >

构造一个触发器audit_log

[编程题]构造一个触发器audit_log
  • 热度指数:99382 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
构造一个触发器audit_log,在向employees_test表中插入一条数据的时候,触发插入相关的数据到audit中。
CREATE TABLE employees_test(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
CREATE TABLE audit(
EMP_no INT NOT NULL,
NAME TEXT NOT NULL
);
后台会往employees_test插入一条数据:
INSERT INTO employees_test (ID,NAME,AGE,ADDRESS,SALARY)VALUES (1, 'Paul', 32, 'California', 20000.00 );
然后从audit里面使用查询语句:
select * from audit;
示例1

输入

drop table if exists audit;
drop table if exists employees_test;

CREATE TABLE employees_test(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);
CREATE TABLE audit(
    EMP_no INT NOT NULL,
    NAME TEXT NOT NULL
);

输出

1|Paul
构造触发器时注意以下几点:
1、用 CREATE TRIGGER 语句构造触发器,用 BEFORE或AFTER 来指定在执行后面的SQL语句之前或之后来触发TRIGGER
2、触发器执行的内容写出 BEGIN与END 之间
3、可以使用 NEW与OLD 关键字访问触发后或触发前的employees_test表单记录


CREATE TRIGGER audit_log AFTER INSERT ON employees_test
BEGIN
    INSERT INTO audit VALUES (NEW.ID, NEW.NAME);
END;

编辑于 2017-07-24 23:13:18 回复(10)
更多回答
CREATE TRIGGER audit_log 
AFTER INSERT 
ON employees_test FOR EACH ROW
BEGIN

INSERT INTO audit VALUES(new.ID,new.NAME);

END;
发表于 2017-07-19 15:49:05 回复(1)
sqlite里面居然不用delimiter临时修改语句结束符,begin和end中语句的分号和end后面的分号居然没有冲突,mysql中是需要临时修改结束符。
完整的语句应该为:
delimiter $//这里用$自定义为结束符,其他的非分号符号也可以
create trigger audit_log after insert on employees_test for each row
begin 
    insert into audit values(new.id,new.name);
end;
delimiter ;//再将结束符改回分号
编辑于 2018-03-16 00:12:41 回复(1)
***题目,代码没有错,就是过不了,复制别人的也过不了
发表于 2020-12-01 16:46:04 回复(1)
create  trigger audit_log 
after insert on employees_test
for each row
begin
    insert into audit(EMP_no, NAME) values (new.ID, new.NAME);
end
;
发表于 2022-04-16 16:01:50 回复(0)
/*
CREATE TRIGGER trigger_name trigger_time trigger_event
 ON table_name
 FOR EACH ROW
 BEGIN
     
 END;
 */
create trigger audit_log after insert
on employees_test
for each row
begin 
     insert into audit value(
         new.ID
         ,new.NAME
     );
end 
/*
关于old和new关键字,
old:执行前的行数据
new:执行后的行数据
*/

发表于 2021-11-19 15:42:49 回复(0)
create trigger audit_log after insert on employees_test 
for each row insert into audit (emp_no,name)values(new.id,new.name);
发表于 2021-11-17 17:34:31 回复(0)
CREATE TRIGGER audit_log AFTER INSERT ON employees_test
FOR EACH ROW
BEGIN
    INSERT INTO audit VALUES (NEW.ID, NEW.NAME);
END;
发表于 2021-10-19 09:34:30 回复(0)
create trigger audit_log
after insert on employees_test
for each row
begin
    insert into audit values(new.id,new.name);
end

发表于 2021-09-08 15:22:50 回复(0)
create trigger `audit_log`
after insert on `employees_test`
for each row
insert into audit values(new.id,new.name);

发表于 2021-08-15 15:53:09 回复(0)
考点:触发器的创建。(提交代码时成功时失败是什么鬼)
create trigger audit_log 
after insert on employees_test
for each row
begin
    insert into audit values(new.id, new.name);
end


发表于 2021-03-27 14:30:10 回复(1)
我复制别人通过的代码都无法通过
显示:
MySQLdb._exceptions.OperationalError: (3730, "Cannot drop table 'employees_test' referenced by a foreign key constraint 'audit_ibfk_1' on table 'audit'.")
问题是什么?
发表于 2020-11-30 11:35:28 回复(8)
create trigger audit_log after insert on employees_test
begin
    insert into audit values(new.id, new.name);
end;
-- 触发器
-- 第一个值要使用id
发表于 2020-06-30 19:26:47 回复(0)
MySQL:
DELIMITER $
CREATE TRIGGER audit_log AFTER INSERT ON employees_test
FOR EACH ROW
BEGIN
INSERT INTO audit(emp_no,NAME) VALUES(new.ID,new.NAME);
END$

tips:一般情况下,mysql默认是以 ; 作为结束执行语句,与触发器中需要的分行起冲突

   为解决此问题可用DELIMITER,如:DELIMITER $,可以将结束符号变成$

  当触发器创建完成后,可以用DELIMITER ;来将结束符号变成;


发表于 2020-06-24 11:18:38 回复(0)

必须写new.,目的是提取新行,去掉就执行不了
发表于 2019-07-11 11:10:30 回复(0)
1.创建触发器使用语句:CREATE TRIGGER trigname;
2.指定触发器触发的事件在执行某操作之前还是之后,使用语句:BEFORE/AFTER [INSERT/UPDATE/ADD] ON tablename
3.触发器触发的事件写在BEGIN和END之间;
4.触发器中可以通过NEW获得触发事件之后2对应的tablename的相关列的值,OLD获得触发事件之前的2对应的tablename的相关列的值
CREATE TRIGGER audit_log AFTER INSERT ON employees_test 
BEGIN
    INSERT INTO audit VALUES(NEW.ID,NEW.NAME);
END;

发表于 2017-09-05 16:05:05 回复(5)
begin和end间的代码块的语句要写分号,否则不通过。
发表于 2017-08-06 13:44:46 回复(2)
初识触发器
语言运行环境:Sql(mysql 8.0)
1.创建触发器:create trigger 触发器名称
2.用after指定触发条件:在表1中每插入一行 after insert on 表1 for each row
(注意insert后用on,for each row不能少否则会报错)
3.触发的指令写在begin和end之间,分号写在指令后,end后不用加分号

create trigger audit_log after insert on employees_test
for each row
begin
insert into audit values(NEW.ID,NEW.NAME);
end


发表于 2021-01-25 11:59:04 回复(4)
create trigger audit_log after insert on employees_test 
begin 
insert into audit values(NEW.ID,NEW.NAME); 
end;
1.create trigger :创建触发器
2.触发器要说明是在after 还是before事务发生时触发
3.要指明是insert 、delete、update操作
4. on 表名
5.begin和end之间写触发的动作
6. new 关键字表示更新后的表的字段 ,old表示更新前的表的字段 
发表于 2017-08-30 17:02:57 回复(2)
sqlite 创建触发器的基本语法:
CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name

ON table_name

BEGIN

-- Trigger logic goes here ;

END;
其中,event_name可以是INSERT, DELETE和UPDATE数据库操作。

首先,触发器的名字trigger_name应该改为audit_log
其次,本题描述是:在一次插入操作的时候,插入新数据到另一个表中,所以[BEFORE|AFTER]选择AFTER event_name 选择 INSERT
然后,注意插入的表是employees_test,而不是employees。因此我们要把上述代码中table_name换成employees_test;
最后,新插入的数据在NEW中,所以插入相同数据到audit的语句是
INSERT INTO audit(emp_no, name) VALUES (NEW.id, NEW.name);
因此,sql的解法:
CREATE TRIGGER audit_log AFTER INSERT

ON employees_test

BEGIN

INSERT INTO audit(emp_no, name) VALUES (NEW.id, NEW.name);

END;

编辑于 2017-09-11 21:12:46 回复(4)