Oracle
 sql >> Base de données >  >> RDS >> Oracle

avantage d'utiliser un déclencheur pour remplir la clé de substitution dans oracle plsql

Ce modèle particulier est en fait assez dangereux car il permet à quelqu'un de saisir manuellement un nouvel identifiant qui pourrait entrer en conflit avec une clé de substitution déjà existante ou celle que votre séquence pourrait générer à l'avenir.

Votre déclencheur devrait vraiment ressembler à ceci pour vous assurer que chaque nouvel enregistrement obtient une clé unique. Si vous utilisez 11.2 ou une version ultérieure, vous n'avez pas besoin de select ... into ...

CREATE OR REPLACE TRIGGER TEST_TRIG
BEFORE INSERT ON my_table
FOR EACH ROW
BEGIN
   :new.column1 := my_table_seq.NEXTVAL;
END;

L'avantage de cette approche est qu'elle est toujours Fini. Quelle que soit la valeur que quelqu'un met dans cette colonne, elle est remplacée par quelque chose qui fonctionnera et qui utilise la séquence correcte ; si quelqu'un oublie de l'ajouter dans la déclaration, cela fonctionnera toujours.

Il est impossible de casser votre clé de substitution.

Avec ce que vous suggérez, imaginez que quelqu'un place un 1 à la place; vous obtenez une violation de clé primaire. Si quelqu'un oublie, il y a plus d'erreurs. Vous ne garantirez jamais que chaque mise à jour de votre table passera par un point d'entrée unique, de sorte que le déclencheur garantit que la PK est correctement renseignée.

Il convient de noter qu'à partir de 12c, vous pouvez utiliser une identité colonne , qui rend explicite le lien entre table et auto-incrémentation ; il n'y a pas besoin d'un déclencheur ou d'une séquence. La syntaxe du DDL de création de table serait :

create table <table_name> ( <column_name> generated as identity );