Desencadenadores y cursores de MySQL

Introducción a los disparadores

Un disparador es un procedimiento almacenado especial asociado con una tabla, que puede activarse para ejecutarse al insertar, eliminar o modificar datos en la tabla. Tiene capacidades de control de datos más refinadas y complejas que las funciones estándar de la propia base de datos.

Ventajas de los desencadenantes:

  • Seguridad: los usuarios pueden tener ciertos derechos para operar la base de datos en función del valor de la base de datos. Por ejemplo, no está permitido modificar los datos de la base de datos después de salir del trabajo y de las vacaciones;
  • Auditoría: puede rastrear las operaciones del usuario en la base de datos;
  • Implemente reglas de integridad de datos complejas. Por ejemplo, el disparador puede hacer retroceder cualquier futuro que intente consumir más de su propio margen;
  • Proporciona otra forma de ejecutar tareas programadas. Por ejemplo, si los fondos de la cuenta de la empresa son inferiores a 50.000 yuanes, los datos de advertencia se enviarán al personal financiero de inmediato.

Usar disparadores en MySQL

Crear disparador

El truco para crear un disparador es recordar los cuatro elementos de un disparador:

  • Lugar de seguimiento: mesa;
  • Monitoreo de eventos: insertar / actualizar / eliminar;
  • Tiempo de activación: después / antes;
  • Evento desencadenante: insertar / actualizar / eliminar.

La sintaxis básica para crear un disparador es la siguiente:


CREATE TRIGGER
-- trigger_name:触发器的名称; 
--  tirgger_time:触发时机,为 BEFORE 或者 AFTER;
--  trigger_event:触发事件,为 INSERT、DELETE 或者 UPDATE; 
 trigger_name trigger_time trigger_event 
 ON
 --  tb_name:表示建立触发器的表名,在哪张表上建立触发器;
 tb_name
 -- FOR EACH ROW 表示任何一条记录上的操作满足触发事件都会触发该触发器。
 FOR EACH ROW
 -- trigger_stmt:触发器的程序体,可以是一条 SQL 语句或者是用 BEGIN 和 END 包含的多条语句; 
 trigger_stmt
  • trigger_name: el nombre del disparador;
  • tirgger_time: tiempo de activación, ANTES o DESPUÉS;
  • trigger_event: evento disparador, que es INSERT, DELETE o UPDATE;
  • tb_name: indica el nombre de la tabla donde se crea el disparador y en qué tabla se crea el disparador;
  • trigger_stmt: el cuerpo del disparador, que puede ser una sentencia SQL o varias sentencias contenidas en BEGIN y END;
  • PARA CADA FILA significa que cualquier operación en un registro que cumpla con el evento activador activará el activador.
    Nota: Para el mismo evento de activación con el mismo tiempo de activación en la misma tabla, solo se puede definir una activación.

Activar registros nuevos y antiguos

NEW y OLD se definen en MySQL para indicar la fila de datos que activó el disparador en la tabla donde se encuentra el disparador:

  • En el disparador INSERT, NEW se usa para representar los nuevos datos que se insertarán (ANTES o DESPUÉS);
  • En el disparador de tipo UPDATE, OLD se usa para representar los datos originales que se modificarán o se han modificado, y NEW se usa para representar los datos nuevos que se modificarán o se han modificado;
  • En el activador DELETE, OLD se usa para indicar los datos originales que se eliminarán o se eliminaron.

Crear un disparador. Cuando un usuario compra un producto, el registro de inventario de producto correspondiente se actualiza al mismo tiempo. El código es el siguiente:

-- 删除触发器,drop trigger 触发器名称
-- if exists判断存在才会删除
drop trigger if exists myty1;
-- 创建触发器
create trigger mytg1-- myty1触发器的名称
after insert on orders-- orders在哪张表上建立触发器;
for each row
begin
	update product set num = num-new.num where pid=new.pid;
end;
-- 往订单表插入记录
insert into orders values(null,2,1);
-- 查询商品表商品库存更新情况
select * from product;

Crear un disparador. Cuando el usuario elimina un pedido, el registro de inventario de producto correspondiente se actualiza al mismo tiempo. El código es el siguiente:

-- 创建触发器
create trigger mytg2
after delete on orders
for each ROW
begin 
-- 对库存进行回退,重新加上
	update product set num = num+old.num where pid=old.pid;
end;
-- 删除订单记录
delete from orders where oid = 2;
-- 查询商品表商品库存更新情况
select * from product;

La diferencia entre antes y después

antes antes de ejecutar la declaración después de después de ejecutar la declaración

Cuando la cantidad del pedido exceda el inventario, modifique la cantidad del pedido al inventario máximo:

-- -- 创建 before 触发器
create trigger mytg3
before insert on orders
for each row 
begin 
	-- 定义一个变量,来接收库存
	declare n int default 0;
	-- 查询库存 把num赋值给n
	select num into n from product where pid = new.pid;
	-- 判断下单的数量是否大于库存量
	if new.num>n then
		-- 大于修改下单库存(库存改为最大量)
	set new.num = n;
	end if;
	update product set num = num-new.num where pid=new.pid;
end;
-- 往订单表插入记录
insert into orders values(null,3,50);
-- 查询商品表商品库存更新情况
select * from product;
-- 查询订单表
select * from orders;

cursor

Introducción a los cursores

La función del cursor es recorrer los registros devueltos consultando la base de datos para realizar las operaciones correspondientes. El cursor tiene las siguientes características

  • El cursor es de solo lectura, es decir, no se puede actualizar;
  • El cursor no se puede desplazar, es decir, sólo se puede desplazar en una dirección, y no se puede mover hacia adelante y hacia atrás entre registros a voluntad, y no puede omitir ciertos registros;
  • Evite actualizar datos en tablas que tengan cursores abiertos.

Crear cursor

La sintaxis para crear un cursor consta de cuatro partes:

  • Definir cursor: declara el cursor del nombre del cursor para la instrucción de selección;
  • Cursor abierto: nombre del cursor abierto;
  • Obtenga el resultado: busque el nombre del cursor en el nombre de la variable [, nombre de la variable];
  • Cerrar el cursor: cerrar el nombre del cursor;

Cree un procedimiento p1, use el cursor para devolver la primera información del estudiante en la tabla de estudiantes en la base de datos de la prueba. El código es el siguiente:

-- 定义过程
create procedure p1()
begin 
	declare id int;
	declare name varchar(20);
	declare age int;
	-- 定义游标  declare 游标名 cursor for select 语句;
	declare mc cursor for select * from student;
	-- 打开游标 open 游标名;
	open mc;
	-- 获取数据 fetch 游标名 into 变量名[,变量名];
	fetch mc into id,name,age;
	-- 打印
	select id,name,age;
	-- 关闭游标
	close mc;
end;
-- 调用过程
call p1();

Cree una tabla de estudiantes2 en la base de datos de la prueba, cree un proceso p2, use el cursor para extraer toda la información de estudiantes en la tabla de estudiantes e insértela en la tabla de estudiantes2. El código es el siguiente:

-- 定义过程
create procedure p3()
begin 
	declare id int;
	declare name varchar(20);
	declare age int;
	declare flag int default 0;
	-- 定义游标  declare 游标名 cursor for select 语句;
	declare mc cursor for select * from student;
	declare continue handler for not found set flag=1;
	-- 打开游标 open 游标名;
	open mc;
	-- 获取数据 fetch 游标名 into 变量名[,变量名];
	a:loop -- 循环获取数据
	fetch mc into id,name,age;
	if flag=1 then -- 当无法fetch时触发continue handler
	leave a;-- 终止循环
	end if;
	-- 进行遍历,将提取的每一行数据插入到 student2 表中
	insert into student2 values(id,name,age);
	end loop;
	-- 关闭游标
	close mc;
end;
-- 调用过程
call p3();
-- 查询 student2 表
select * from student2;

Supongo que te gusta

Origin blog.csdn.net/chaotiantian/article/details/114797795
Recomendado
Clasificación