«

»

fév 19

Imprimer ceci Article

Créer un trigger en sql

Comment créer un trigger en SQL DB2 ?

Un trigger est un déclencheur, il s’exécute avant/après une opération (mise à jour, insertion, suppression) dans la table concernée.

On les utilise beaucoup pour garder une cohérence dans la base de données (comme une mise à jour d’une autre table) mais pas seulement : application de règles métiers, contrôle des données insérées, log … . La plupart des trigger que j’ai rencontré sont en RPG, ils fonctionnent très bien mais pour les jeunes développeurs … il s’agit de l’ancien temps !! Heureusement, il est possible de les réaliser en SQL et sont donc maintenables par n’importe quelle ressource qui fait du SQL.

Exemple :

CREATE TRIGGER MA_LIB.LE_NOM_DE_MON_TRIGGER
AFTER INSERT ON MA_LIB . MA_TABLE
REFERENCING NEW AS N
FOR EACH ROW
MODE DB2SQL

:
BEGIN ATOMIC

INSERT INTO MA_LIB . MA_TABLE ( champA, ... )
VALUES ( N . champ1 , ... ) ;
END ;

Syntaxe générale :

IBM Knowledge Center

>>-CREATE TRIGGER--trigger-name--+-NO CASCADE BEFORE-+---------->
                                 +-AFTER-------------+   
                                 '-INSTEAD OF--------'   

>--+-INSERT-------------------------+--ON--+-table-name-+------->
   +-DELETE-------------------------+      '-view-name--'   
   '-UPDATE--+--------------------+-'                       
             |    .-,-----------. |                         
             |    V             | |                         
             '-OF---column-name-+-'                         

>--+----------------------------------------------------------------+-->
   |              .-----------------------------------------------. |   
   |              V  (1)         .-AS-.                           | |   
   '-REFERENCING----------+-OLD--+----+--correlation-name-------+-+-'   
                          |      .-AS-.                         |       
                          +-NEW--+----+--correlation-name-------+       
                          |            .-AS-.                   |       
                          +-OLD_TABLE--+----+--table-identifier-+       
                          |            .-AS-.                   |       
                          '-NEW_TABLE--+----+--table-identifier-'       

                                            .-NOT SECURED-.   
>--+-FOR EACH ROW-------+----MODE DB2SQL----+-------------+----->
   '-FOR EACH STATEMENT-'                   '-SECURED-----'   

>--| triggered-action |----------------------------------------><

triggered-action

Read syntax diagram
>>-+--------------------------+--| SQL-trigger-body |----------><
   '-WHEN--(search-condition)-'                         

SQL-trigger-body

Read syntax diagram
>>-+-triggered-SQL-statement---------------------------+-------><
   |               .----------------------------.      |   
   |               V                            |      |   
   '-BEGIN ATOMIC----triggered-SQL-statement--;-+--END-'

Brève explication :

  • Before, after, instead of : Avant, après, au lieu de …
  • Insert, delete, update : à l’insertion, à la suppression ou à la mise à jour, pour la mise à jour ça peut être sur n’importe quelle colonne ou bien seulement sur celles spécifiées
  • Referencing : c’est là que vous allez indiquer l’alias qui sera utilisé pour manipuler les données (NEW ne s’applique que pour les insert et update de record)
  • For each ROW :le trigger va se lancer pour chaque ligne (imaginez un update sur plusieurs lignes), si aucune ligne n’est impactée, le trigger ne se lancera pas
  • For each STATEMENT : se lance 1 fois pour l’ensemble d’opération et se lancera même si aucune action n’est effectuée
  • DB2SQL / DB2ROW n’intervient que lorsque plusieurs lignes sont impactées et que le For each row est choisi. DB2ROW : exécuté au moment où chaque ligne est modifiée mais les valeurs sont celles avant la modification. DB2SQL : sera exécuté après que les lignes soient modifiées, les valeurs de travail seront celles qui ont été modifiées

Avec l’assistant ISeries Navigator




Voici d’autres exemples :

CREATE TRIGGER D_PRO_F.TRIGA
BEFORE UPDATE OF TRTTIE , TRNA , TRNB , TRNC , TRND ON MALIB . MATABLE
REFERENCING NEW AS N
FOR EACH ROW
MODE DB2ROW
WHEN ( N . TRTTIE <> ' ' )
BEGIN ATOMIC
-- Condition
IF ( N . TRTTIE = 'C' ) THEN

SELECT C . COL1, C . COL2 , 0 , 0  INTO N . TRLIB1 , N . TRLIB2 , N . TRN3 , N . TRN4
FROM MALIB . TABLELIB C WHERE C . TRTTIE = N . TRTTIE  AND C . VIE = ' ' ;
END IF ;

Autre cas/conditions …

END;

—-

BEGIN ATOMIC

DECLARE T_TEMP DECIMAL ( 3 , 0 ) ;

IF ( TRIM ( N . LIB ) <> '' ) THEN

SELECT C . SEARCH
INTO TEMP_NOM
FROM MALIB . MATABLE C
WHERE condition
FETCH FIRST 1 ROWS ONLY ;

END IF ;

IF ( T_TEMP IS NOT NULL ) THEN
SET ( N . NUM ) = ( T_TEMP ) ;
END IF ;

END  ;

Voilà, en espérant vous avoir aidé dans vos recherches !
maKyo

Lien Permanent pour cet article : http://ma-kyo.com/creer-un-trigger-en-sql-db2/