Comprensión profunda de los desencadenantes de MySQL

Comprensión básica:

1. Use la ocasión:

Los desencadenantes se basan en eventos, y el evento principal es la adición, eliminación y modificación de MySQL, es decir, insertar, eliminar y actualizar.

2. Nombre del disparador

Los nombres de activadores existen en el espacio de nombres del esquema, lo que significa que todos los activadores deben tener nombres únicos dentro de un esquema. Los disparadores en diferentes esquemas pueden tener el mismo nombre.

Debido a que el activador está en el espacio de nombres de una sola tabla, el nombre del activador de la misma tabla debe ser diferente. Las diferentes tablas pueden tener el mismo nombre de activador.

3. Activar orden de ejecución

Si existe el mismo activador de actualización (o eliminar, insertar), se ejecutará de acuerdo con el momento de la creación.

Y SIGUE y PRECEDE puede modificar el orden de ejecución del disparador

Por ejemplo, el caso oficial:

mysql> CREAR GATILLO ins_transaction ANTES DE INSERTAR en la cuenta

      POR CADA FILA PRECEDE ins_sum

      CONJUNTO

      @deposits = @deposits + IF (NEW.amount> 0, NEW.amount, 0),

      @withdrawals = @withdrawals + IF (NEW.amount <0, -NEW.amount, 0);

Consulta OK, 0 filas afectadas (0.01 seg)

ins_transaction e ins_sum son los nombres de los dos desencadenantes.

4. El papel del disparador :

1. Seguridad. El usuario puede tener ciertos derechos para operar la base de datos en función del valor de la base de datos.

1) La operación del usuario puede restringirse en función del tiempo, por ejemplo, no está permitido modificar los datos de la base de datos después del trabajo y las vacaciones.

2) La operación del usuario puede restringirse en función de los datos de la base de datos, por ejemplo, no se permite que el monto de la compra de un solo producto sea mayor que un valor fijo.

2. Auditoría. Puede rastrear las operaciones del usuario en la base de datos. 

 1) Declaraciones de auditoría de la base de datos de operación del usuario.

 2) Escriba las actualizaciones de los usuarios en la base de datos en la tabla de auditoría.

No lo he usado porque no lo he usado. Lo agregaré más tarde.

3. Implemente reglas complejas de integridad de datos

Implemente comprobaciones y restricciones de integridad de datos no estándar. Los desencadenantes pueden producir restricciones más complejas que las reglas. A diferencia de las reglas, los disparadores pueden hacer referencia a columnas u objetos de la base de datos. Por ejemplo, un disparador puede hacer retroceder cualquier futuro que intente comer más que su propio margen.

4. Implemente reglas complejas de integridad no estándar relacionadas con la base de datos.

1) Los activadores pueden actualizar tablas relacionadas en serie en la base de datos. Esta es una función de realización más utilizada.

2) El activador puede rechazar o revertir aquellos cambios que dañan la integridad relevante y cancelar la transacción que intenta actualizar los datos. Este tipo de disparador funciona cuando se inserta una clave externa que no coincide con su clave principal.

En el siguiente ejemplo, describiré estas dos características con más detalle.

5. Sincronice los datos en la tabla en tiempo real.

6. Calcule automáticamente el valor de los datos, si el valor de los datos cumple ciertos requisitos, luego realice un procesamiento específico.

Por ejemplo, si los fondos en la cuenta de la compañía son inferiores a 50,000 yuanes, envíe inmediatamente datos de advertencia al personal financiero.

( 1 ) Insertar datos:

Cuando un usuario agrega un pedido, debemos realizar los cambios correspondientes en el almacenamiento en la tabla de productos

mysql> crear desencadenante shop_goods -> después de insertar en el carro
     de compras
     -> para cada fila
     -> actualizar el conjunto de mercancías storage = storage-new.amount donde id = new.g_id
     -> ; 
Consulta OK, 0 filas afectadas ( 0.03 segundos) 

mysql > insertar en los valores del carrito de compras (1,1,2);

Resultados de la consulta:

bienes 表
 + ------- + --------- + ------------- + --------- + 
| id | gname | descripción | almacenamiento | 
+ ------- + --------- + ---------- - + --------- + 
| 1 | huawei | rongyao9 | 198 | 
El | 2 | iphone | iphoneX | 100 
+ ------- + --------- + ------------- + --------- + 

shoppingcar 表
 + ---- - - + ----- - + -------- + 
| u_id | g_id | cantidad | 
+ ------- + ------- + -------- + 
| 1 | 1 | 2 | 
+ ------- + ------- + -------- +

Sobre el uso de nuevos y viejos

nuevo representa una nueva fila de datos y antiguo representa una fila de datos antigua

( 2 ) Eliminar datos

Por ejemplo, cuando un usuario cancela un pedido, necesitamos volver a agregar la cantidad de bienes

mysql> create trigger shop_good1
     -> después de eliminar en shoppingcar
     -> para cada fila
     -> actualizar el conjunto de mercancías storage = storage + old.amount donde id = old.g_id; 
Consulta OK, 0 filas afectadas ( 0.01 seg)
删除 前 :
mysql > select * from goods;
+ ----- + --------- + ------------- + --------- + 
| id | gname | descripción | almacenamiento | 
+ ----- + --------- + ------------- + --------- + 
| 1 | huawei | rongyao9 | 198 | 
El | 2 | iphone | iphoneX | 100 
+ ----- + --------- + ------------- + --------- + 
2 filas en conjunto (0.00 seg) 


mysql > seleccione * de shoppingcar;
+ ------ + ------ + -------- + 
| u_id | g_id | cantidad | 
+ ------ + ------ + -------- + 
| 1 | 1 | 2 | 
+ ------ + ------ + -------- + 
1 filas en conjunto (0.00 seg)
Eliminar datos: 
mysql > eliminar del carro de compras donde g_id = 1 ; 
Consulta OK, 1 fila afectada (0.03 segundos)

El resultado:

( 3 ) Actualizar datos (puede aumentar o disminuir)

Cuando el usuario desea modificar la cantidad de un determinado producto comprado modificando la cantidad del carrito de compras, entonces nuestro inventario también debe modificarse.

mysql> crear desencadenador shop_good2
     -> después de actualizar en shoppingcar
     -> para cada fila
     -> actualizar el conjunto de mercancías storage = storage-new.amount + old.amount donde id = new.g_id / old.g_id ; 
Consulta OK, 0 filas afectadas ( 0.14 segundos)

Ver comandos de activación

mostrar disparadores

Este comando solo puede ver qué activadores hay, pero no la información específica de los activadores.

Toda la información del activador se almacena en la tabla de activadores en la base de datos information_schema , y puede consultarse utilizando las instrucciones SELECT. Si hay muchos desencadenantes, es mejor consultar un cierto desencadenante a través del campo TRIGGER_NAME.

Por ejemplo:

SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME = 'XXX';

(4) Restricciones

Las restricciones condicionales son muy importantes para algunas ocasiones que involucran cantidades (como se menciona en el párrafo inicial), y también se aplicarán en la cantidad de restricciones de compra de comercio electrónico.

Trigger usa delimitador, begin y if se bloquea para lograr las condiciones límite.

例如: 
mysql > delimitador //            
mysql > crear shop_limit gatillo antes de actualización sobre shoppingcar
     -> para cada fila
     -> empezar
     ->    si new.amount> 3 a continuación
     -> set new.amount = 3 ;
    -> elseif new.amount < 0 then
     -> set new.amount = 0;
    -> finaliza si ;
    -> fin; // 
mysql > delimitador;

Los bloques de instrucciones condicionales se envuelven con inicio y fin

delimitador: cambie el carácter final, porque; es el carácter final predeterminado en MySQL, si el símbolo aparece en el bloque del programa, causará conflictos. Finalmente, el terminador debe ser modificado nuevamente. Tenga en cuenta que hay un espacio entre el delimitador y el terminador, de lo contrario no será posible cambiar.

Antes de actualizar los datos:

Actualizar datos:

mysql> actualizar la cantidad establecida del carro de compras = 4 donde u_id = 1 ; 
Consulta correcta, 1 fila afectada (0,02 segundos) 
Filas coincidentes: 1 Modificado: 1 Advertencias: 0

Después de actualizar los datos:

El volumen de compra no puede exceder 3

Sobre disparadores y transacciones

Para la tabla de transacciones (Innodb), el fallo de la declaración de juicio que sigue a la declaración anterior hará que todos los cambios ejecutados por la declaración de evento se reviertan . La falla del disparador hará que la declaración falle, por lo que la falla del disparador también causará una reversión. Para las tablas no transaccionales (MyISAM), este tipo de reversión no se puede realizar, por lo que a pesar de la falla de la instrucción, cualquier cambio realizado antes del punto de error sigue siendo válido.

Restricciones en el uso de desencadenantes

El disparador tiene algunas limitaciones:

1. Los desencadenantes no pueden usar la instrucción CALL para devolver datos al cliente o usar procedimientos dinámicos almacenados de SQL. Sin embargo, el procedimiento almacenado puede devolver datos al activador a través de los parámetros OUT o INOUT.

2. Trigger no puede usar declaraciones relacionadas con transacciones, como START TRANSACTION, COMMIT o ROLLBACK. Debido a que los procesos desencadenantes actualizan, eliminan, insertan y otros eventos, y los ejecuta en el orden anterior, declaración SQL, y después, una vez que un determinado paso va mal, los datos se revierten. Si las transacciones se utilizan en disparadores, surgirán conflictos.

Supongo que te gusta

Origin www.linuxidc.com/Linux/2020-04/162980.htm
Recomendado
Clasificación