OVH Cloud OVH Cloud

Comprehension/Faisabilité Trigger.

11 réponses
Avatar
YDN
Bonjour à tous,
Je me pose une question sur ce que sont les Trigger et si ce que je veux faire est réalisable avec cet outils.

En fait je souhaiterai qu'en ajout d'enregistrement un champ (une colonne dans la terminologie ce me semble) prenne une valeur issu
d'une autre table.

J'ai peur d'avoir compris ici que les trigger sont là pour traiter des enregistrements en masse. Ce qui n'est pas mon cas ici.
Je veux juste aider à la saisie en mettant une valeur par défaut en ajout d'enregistrement, si l'utilisateur veux ensuite modifier
les valeurs il le pourra. Donc le Trigger ne doit se déclencher que sur ajout.

Est ce faisable ? si oui j'imagine que la structure est de l'ordre de :

CREATE Trigger MonDeclencheur on MaTableCible
For Insert
As
---
Là je sèche complètement sur la syntaxe si mon cas de figure est faisable je pense à un truc du style :
Select MonChampAMettreAjour=MaTableSource.MonChampSource
Insert Into MaTableCible.
Mais d'abord la syntaxe n'est pas accepté, ça me parait, pas juste, trop simple...

Merci de toute contribution.
Merci d'avoir lu jusque là.

1 réponse

1 2
Avatar
Fred BROUARD
Cela me semble bon :

CREATE TRIGGER MPTQMP
ON DETAIL
FOR INSERT
AS
UPDATE DETAIL
SET MA_COLONNE_A_METTRE_A_JOUR = ENTETE.MA_COLONNE_SOURCE
FROM DETAIL D
INNER JOIN inserted i
ON D.COLONNE_CLEF = i.COLONNE_CLEF
INNER JOIN ENTETE E
ON D.COLONNE_CLEF=E.COLONNE_CLEF

A +


YDN a écrit:
Bonsoir à tous, Bonsoir et merci à toi Fred,
Bon je ne comprends pas, je ne comprends pas pourquoi ça ne fait ... rien.
A votre bon coeur, si vous voulez bien voici mon essai de Trigger :
CREATE TRIGGER MPTQMP ON DETAIL

FOR INSERT
AS
UPDATE DETAIL
SET MA_COLONNE_A_METTRE_A_JOUR = ENTETE.MA_COLONNE_SOURCE
FROM DETAIL INNER JOIN inserted i ON DETAIL.COLONNE_CLEF = i.COLONNE_CLEF
INNER JOIN ENTETE ON DETAIL.COLONNE_CLEF=ENTETE.COLONNE_CLEF

Merci de toute contribution.
Merci d'avoir lu jusque là.




"Fred BROUARD" a écrit dans le message de news: eVOMa$$

ce qui remplace le filtre Where c'est la jointure entre la table inserted et la table cible. Si 3 lignes sont mise à jour
simultanément alors inserted contiendra ces trois lignes et la jointure fera que la table cible ne sera impactée que pour ces 3
lignes là.

A +

YDN a écrit:

Bonsoir et merci beaucoup Fred pour ta réponse,


Oui, la notion de champ n'existe pas...
...http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L2



Merci de ce premier éclaircissement.
Mais le quatrième est celui que j'ai préféré :


Est ce faisable ?



Tout à fait.




Ton "Attention" m'a bien permi de comprendre la structure de ton exemple. "INNER JOIN inserted I"

Du coup ton exemple est pour moi très explicite (pour être honnête avec Philippe T, ma lecture de sa contribution m'avait déjà
bien dégrossi) mais franchement...
du coup j'ai fait un autre Trigger sur ta base et la syntaxe a été accepter !!!! Et je suis même arrivé à mettre ma table source
!!!
Par contre
1) Mon Trigger ne rempli pas ma colonne :-(.
2) tu ne m'as pas mis de close Where dans ton exemple, j'en ai fait de même. Du coup, est ce pour cela ? Toute validation d'ajout
d'enregistrement est long... Ne mettrait il pas à jour tout les lignes existantes...
Quoi que, non ? l'absence de close Where, doit plutôt le perturber pour savoir quel ligne de la table source il doit prendre en
compte ?

J'ai oublié une précision importante j'ai une relation mère fille entre source et cible.
Je veux en effet (je pense que c'est bateau) mettre à jour des colonnes de la table "lignes"(cible) à partir d'une colonne de sa
table "en tête"(source).

Je cherche encore, et en tout cas merci encore
Merci d'avoir lu jusque là.


"Fred BROUARD" a écrit dans le message de news: %


Bonjour,

YDN a écrit:


Bonjour à tous,
Je me pose une question sur ce que sont les Trigger et si ce que je veux faire est réalisable avec cet outils.

En fait je souhaiterai qu'en ajout d'enregistrement un champ (une colonne dans la terminologie ce me semble) prenne une valeur
issu d'une autre table.



Oui, la notion de champ n'existe pas en base de données car une base ne procède pas à la saisie. or le champ est une notion
visuelle. En matière de SGBDR on parle ligne (et non enregistrement) et colonne (et non champ).
A lire sur le sujet : http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L2



J'ai peur d'avoir compris ici que les trigger sont là pour traiter des enregistrements en masse.



Tout à fait. Si une insertion, modif ou suppression concerne 100 000 lignes, le trigger ne se déclenche qu'une seule fois.
Autrement dit le trigger se déclenche sur l'ordre SQL concerné (INSERT, UPDATE, DELETE) que cet ordre concerne zéro lignes, une
seule ou de nombreuses lignes.



Ce qui n'est pas mon cas ici.



Aucune importance car dans l'avenir ce peut être le cas.



Je veux juste aider à la saisie en mettant une valeur par défaut en ajout d'enregistrement, si l'utilisateur veux ensuite
modifier les valeurs il le pourra. Donc le Trigger ne doit se déclencher que sur ajout.

Est ce faisable ?



Tout à fait.

Attention : dans le trigger, les données impactées figurent dans une pseudo table de nom "inserted" ou "deleted", suivant que
l'on procéde par ajout ou modif (inserted) ou bien par suppression (deleted). Il faut donc utiliser cette pseudo table dans le
corps du trigger.




si oui j'imagine que la structure est de l'ordre de :

CREATE Trigger MonDeclencheur on MaTableCible
For Insert
As
---
Là je sèche complètement sur la syntaxe si mon cas de figure est faisable je pense à un truc du style :
Select MonChampAMettreAjour=MaTableSource.MonChampSource
Insert Into MaTableCible.
Mais d'abord la syntaxe n'est pas accepté, ça me parait, pas juste, trop simple...




Voici un modèle pour ce faire :

CREATE TRIGGER TRG_POUR_FAIRE_CECI
ON TABLE_IMPACTEE
FOR INSERT
AS

UPDATE TABLE_IMPACTEE
SET MA_COLONNE_A_METTRE_A_JOUR = TS.MA_COLONNE_SOURCE



FROM TABLE_IMPACTEE TI



INNER JOIN inserted I
ON TI.COLONNE_CLEF = I.COLONNE_CLEF
INNER JOIN TABLE_SOURCE TS
ON TI.??? = TS.???


C'est tout. Comme tu n'as pas décrit ni tes tables, ni tes colonnes difficile de t'en dire plus.
A lire :
http://sqlpro.developpez.com/cours/sqlserver/transactsql/#L5.2

A +




Merci de toute contribution.
Merci d'avoir lu jusque là.



--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************








--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************









--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
1 2