web-dev-qa-db-fra.com

déclencheur de niveau ligne vs déclencheur de niveau instruction

J'ai du mal à comprendre la différence entre «déclencheurs au niveau de la ligne» et «déclencheurs au niveau de l'instruction». 

D'après ce que j'ai compris, dans le scénario, un déclencheur de niveau instruction est créé, l'ensemble de la table peut être modifié. Un déclencheur au niveau de la ligne ne me permettrait que de modifier le tuple affecté par l'événement spécifique du déclencheur. 

Est-ce correct? Quelqu'un at-il un exemple des deux?

Merci! 

45

La différence principale n’est pas ce qui peut être modifié par le déclencheur, cela dépend du SGBD. Un déclencheur (niveau ligne ou instruction) peut également modifier une ou plusieurs lignes, de la même table ou d’autres, et avoir des effets en cascade (déclencher d’autres actions/déclencheurs), mais tout dépend du SGBD.

La principale différence est le nombre de fois que le déclencheur est activé. Imaginez que vous avez une table de 1 million de lignes et que vous exécutez:

UPDATE t
SET columnX = columnX + 1

Un déclencheur au niveau de l'instruction sera activé une fois (et même si aucune ligne n'est mise à jour). Un déclencheur au niveau de la ligne sera activé un million de fois, une fois pour chaque ligne mise à jour .


Une autre différence est la commande ou l'activation. Par exemple, dans Oracle, les 4 types de déclencheurs différents seront activés dans l'ordre suivant:

Before the triggering statement executes
Before each row that the triggering statement affects
After each row that the triggering statement affects
After the triggering statement executes

Dans l'exemple précédent, nous aurions quelque chose comme:

Before statement-level trigger executes

  Before row-level trigger executes
  One row is updated
  After row-level trigger executes

  Before row-level trigger executes
  Second row is updated
  After row-level trigger executes

  ...

  Before row-level trigger executes
  Millionth row is updated
  After row-level trigger executes

After statement-level trigger executes
73
ypercubeᵀᴹ

Vous souhaiterez peut-être que l'action du déclencheur s'exécute une fois après que le client a exécuté une instruction modifiant un million de lignes (déclencheur de niveau instruction). Vous pouvez également déclencher l'action une fois pour chaque ligne modifiée (déclencheur de niveau ligne). 

EXEMPLE: Disons que vous avez un déclencheur qui assurera la réussite de tous les lycéens. C'est-à-dire que, lorsque la note d'un senior est de 12 ans et que nous l'augmentons à 13, nous voulons définir la note sur NULL.

Pour un déclencheur de niveau instruction, vous diriez qu’après l’exécution de l’instruction de relèvement, vérifiez une fois le tableau entier pour mettre à jour tous les messages de 13e à NULL.

Pour un déclencheur au niveau de la ligne, vous diriez qu'après chaque ligne mise à jour, mettez à jour la note de la nouvelle ligne à NULL si elle est 13.

Un déclencheur au niveau de l'instruction ressemblerait à ceci:

create trigger stmt_level_trigger
after update on Highschooler
begin
    update Highschooler
    set grade = NULL
    where grade = 13;
end;

et un déclencheur au niveau de la ligne ressemblerait à ceci:

create trigger row_level_trigger
after update on Highschooler
for each row
when New.grade = 13
begin
    update Highschooler
    set grade = NULL
    where New.ID = Highschooler.ID;
end;

Notez que SQLite ne prend pas en charge les déclencheurs au niveau instruction, de sorte que, dans SQLite, le FOR EACH ROW est facultatif.

17
Rose Perrone

La principale différence entre le déclencheur de niveau de déclaration est la suivante:

déclencheur de niveau instruction: basé sur le nom, il fonctionne si une instruction est exécutée . Ne dépend pas du nombre de lignes ou des lignes effectuées.Il s'exécute une seule fois . Exp: si vous souhaitez mettre à jour le salaire de chaque employé de département HR et à la fin vous voulez savoir combien de lignes sont affectées signifie combien de salaire a été augmenté puis utilisez déclencheur de niveau instruction . veuillez noter que ce déclencheur s’exécutera même si aucune ligne n’est mise à jour car il est appelé déclencheur de niveau instruction si une déclaration a été exécutée. Peu importe si cela affecte des lignes ou non.

Déclencheur de niveau de ligne: s'exécute à chaque fois qu'une ligne est affectée. Si zéro ligne est affectée, aucun déclencheur de niveau de ligne ne sera exécuté.suppose si vous voulez supprimer un employé de la table emp dont le département est HR et que vous voulez dès que l'employé est supprimé de la table emp, le nombre de tables dans la section HR doit être réduit 1. Ensuite, vous devriez opter pour un déclencheur au niveau de la ligne.

1
pinaki

si vous souhaitez exécuter l'instruction lorsque le nombre de lignes est modifié, vous pouvez activer les déclencheurs au niveau de l'instruction .. viseversa ... lorsque vous souhaitez exécuter votre instruction à chaque modification de votre nombre de lignes, puis vous devez pour les déclencheurs de niveau ligne.

par exemple: les déclencheurs de niveau instruction fonctionnent lorsque la table est modifiée .. plus le nombre d'enregistrements est effectué ..__ et les déclencheurs de niveau ligne fonctionnent lorsque chaque mise à jour ou modification de ligne ..

0
ananth

1) le déclencheur de niveau ligne est utilisé pour effectuer des actions sur un ensemble de lignes comme insertion, mise à jour ou suppression

exemple: -Vous devez supprimer un ensemble de lignes et, simultanément, les lignes supprimées doivent également être insérées dans une nouvelle table à des fins d'audit.

2) Déclencheur de niveau d'instruction: - il est généralement utilisé pour imposer une restriction à l'événement que vous effectuez.

exemple: - restriction à la suppression des données entre 22 heures et 6 heures;

j'espère que cela t'aides:)

0
Sajal Agarwal

déclencheur de niveau instruction n'est qu'une fois pour l'instruction dml

0
A rajasekhar