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à.

10 réponses

1 2
Avatar
Philippe T [MS]
Bonjour,

Oui cela va fonctionner avec quelque chose du type :

CREATE Trigger MonDeclencheur on MaTableCible
FOR INSERT
AS
BEGIN

DECLARE @MyDefValue nvarchar(100)

SELECT @MyDefValue = MyValue FROM MyDefaultTable WHERE ...

UPDATE MaTableCible
SET MonChampAMettreAjour = @MyDefValue
FROM MaTableSource
INNER JOIN inserted i ON MaTableSource.ID = i.ID

END

Utiliser la table inserted dans le trigger. Elle comprend les
enregistrements qui ont été insérés.

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France

"YDN" wrote in message
news:%
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à.



Avatar
Fred BROUARD
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 *************************
Avatar
Jean-Nicolas BERGER
Attention : le trigger n'est exécuté qu'une seule fois, que l'insert
concerne une ligne ou plusieurs.
Et dans le cas où l'insert concerne plusieurs lignes, le code ci-dessous
risque de foutre un beau bordel....
Moralité : bien réfléchir avant d'utiliser des variables dans des triggers
(sauf cas particulier des curseurs...)
JN.


"Philippe T [MS]" a écrit dans le message de
news:
Bonjour,

Oui cela va fonctionner avec quelque chose du type :

CREATE Trigger MonDeclencheur on MaTableCible
FOR INSERT
AS
BEGIN

DECLARE @MyDefValue nvarchar(100)

SELECT @MyDefValue = MyValue FROM MyDefaultTable WHERE ...

UPDATE MaTableCible
SET MonChampAMettreAjour = @MyDefValue
FROM MaTableSource
INNER JOIN inserted i ON MaTableSource.ID = i.ID

END

Utiliser la table inserted dans le trigger. Elle comprend les
enregistrements qui ont été insérés.

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France



Avatar
YDN
Bonsoir et merci beaucoup pour ta réponse,
Oui cela va fonctionner


Déjà rien que pour ça !

Oui alors j'avais pas envisager effectivement la nécessité de la clause SELECT dont je ne me suis pas senti tout de suite capable...
J'ai donc troqué peut être peu intelligement pour un
SELECT @MyDefValue="TestSaisieTrigger"
En tout cas la vérification de syntaxe ne bloque pas dessus mais par contre elle bloque sur la partie
INNER JOIN inserted i ON MaTableSource.ID = i.ID


en indiquant "syntaxe incorrecte vers 'CeQueJeMetsCommeId'" A noter j'ai cru comprendre que ID est le nom de la colonne (que
j'appelle clé au sens BD Access).
Je ne comprends pas ce bloquage, je cherche encore mais pas ce soir.
J'espérais revenir avec un résultat positif, en tout cas merci.
Merci d'avoir lu jusque là.


"Philippe T [MS]" a écrit dans le message de news:
Bonjour,

Oui cela va fonctionner avec quelque chose du type :

CREATE Trigger MonDeclencheur on MaTableCible
FOR INSERT
AS
BEGIN

DECLARE @MyDefValue nvarchar(100)

SELECT @MyDefValue = MyValue FROM MyDefaultTable WHERE ...

UPDATE MaTableCible
SET MonChampAMettreAjour = @MyDefValue
FROM MaTableSource
INNER JOIN inserted i ON MaTableSource.ID = i.ID

END

Utiliser la table inserted dans le trigger. Elle comprend les enregistrements qui ont été insérés.

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France

"YDN" wrote in message news:%
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à.







Avatar
YDN
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 *************************



Avatar
Philippe T [MS]
Bonjour,

Cela dépend car si c'est une valeur par défaut identique pour tous les
enregistremenst (c'est ce que j'ai cru comprendre), cela ne pose pas de
problème. Sans cela évidemment il faut faire la jointure avec la table des
valeurs par défaut dans l'UPDATE directement.

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France

"Jean-Nicolas BERGER" wrote in
message news:%
Attention : le trigger n'est exécuté qu'une seule fois, que l'insert
concerne une ligne ou plusieurs.
Et dans le cas où l'insert concerne plusieurs lignes, le code ci-dessous
risque de foutre un beau bordel....
Moralité : bien réfléchir avant d'utiliser des variables dans des triggers
(sauf cas particulier des curseurs...)
JN.


"Philippe T [MS]" a écrit dans le message
de news:
Bonjour,

Oui cela va fonctionner avec quelque chose du type :

CREATE Trigger MonDeclencheur on MaTableCible
FOR INSERT
AS
BEGIN

DECLARE @MyDefValue nvarchar(100)

SELECT @MyDefValue = MyValue FROM MyDefaultTable WHERE ...

UPDATE MaTableCible
SET MonChampAMettreAjour = @MyDefValue
FROM MaTableSource
INNER JOIN inserted i ON MaTableSource.ID = i.ID

END

Utiliser la table inserted dans le trigger. Elle comprend les
enregistrements qui ont été insérés.

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France







Avatar
Fred BROUARD
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 *************************
Avatar
YDN
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 *************************



Avatar
YDN
Bonsoir à tous,
Ma question est un peu la suite de mes problèmes persistant d'hier.
Existe t il, sous sql server, un outils d'analyse permettant de savoir quels sont les trigger en cours d'execution. Et puis peut
être l'interpretation, résultat de leurs différentes commandes.
J'ai vu l'analyseur de requête, le générateur de profil, mais je n'y ai rien trouvé d'approchant.
Merci de toute contribution.
Merci d'avoir lu jusque là.


"YDN" a écrit dans le message de news: %23RKa%
Bonsoir et merci beaucoup pour ta réponse,
Oui cela va fonctionner


Déjà rien que pour ça !

Oui alors j'avais pas envisager effectivement la nécessité de la clause SELECT dont je ne me suis pas senti tout de suite
capable...
J'ai donc troqué peut être peu intelligement pour un
SELECT @MyDefValue="TestSaisieTrigger"
En tout cas la vérification de syntaxe ne bloque pas dessus mais par contre elle bloque sur la partie
INNER JOIN inserted i ON MaTableSource.ID = i.ID


en indiquant "syntaxe incorrecte vers 'CeQueJeMetsCommeId'" A noter j'ai cru comprendre que ID est le nom de la colonne (que
j'appelle clé au sens BD Access).
Je ne comprends pas ce bloquage, je cherche encore mais pas ce soir.
J'espérais revenir avec un résultat positif, en tout cas merci.
Merci d'avoir lu jusque là.


"Philippe T [MS]" a écrit dans le message de news:
Bonjour,

Oui cela va fonctionner avec quelque chose du type :

CREATE Trigger MonDeclencheur on MaTableCible
FOR INSERT
AS
BEGIN

DECLARE @MyDefValue nvarchar(100)

SELECT @MyDefValue = MyValue FROM MyDefaultTable WHERE ...

UPDATE MaTableCible
SET MonChampAMettreAjour = @MyDefValue
FROM MaTableSource
INNER JOIN inserted i ON MaTableSource.ID = i.ID

END

Utiliser la table inserted dans le trigger. Elle comprend les enregistrements qui ont été insérés.

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France

"YDN" wrote in message news:%
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à.











Avatar
Philippe T [MS]
Bonjour,

Rien de spécifique pour les triggers. Par contre vous pouvez tout de même au
niveau de profiler monitorer ce qui passe.

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France

"YDN" wrote in message
news:%
Bonsoir à tous,
Ma question est un peu la suite de mes problèmes persistant d'hier.
Existe t il, sous sql server, un outils d'analyse permettant de savoir
quels sont les trigger en cours d'execution. Et puis peut être
l'interpretation, résultat de leurs différentes commandes.
J'ai vu l'analyseur de requête, le générateur de profil, mais je n'y ai
rien trouvé d'approchant.
Merci de toute contribution.
Merci d'avoir lu jusque là.


"YDN" a écrit dans le message de news:
%23RKa%
Bonsoir et merci beaucoup pour ta réponse,
Oui cela va fonctionner


Déjà rien que pour ça !

Oui alors j'avais pas envisager effectivement la nécessité de la clause
SELECT dont je ne me suis pas senti tout de suite capable...
J'ai donc troqué peut être peu intelligement pour un
SELECT @MyDefValue="TestSaisieTrigger"
En tout cas la vérification de syntaxe ne bloque pas dessus mais par
contre elle bloque sur la partie
INNER JOIN inserted i ON MaTableSource.ID = i.ID


en indiquant "syntaxe incorrecte vers 'CeQueJeMetsCommeId'" A noter j'ai
cru comprendre que ID est le nom de la colonne (que j'appelle clé au sens
BD Access).
Je ne comprends pas ce bloquage, je cherche encore mais pas ce soir.
J'espérais revenir avec un résultat positif, en tout cas merci.
Merci d'avoir lu jusque là.


"Philippe T [MS]" a écrit dans le message
de news:
Bonjour,

Oui cela va fonctionner avec quelque chose du type :

CREATE Trigger MonDeclencheur on MaTableCible
FOR INSERT
AS
BEGIN

DECLARE @MyDefValue nvarchar(100)

SELECT @MyDefValue = MyValue FROM MyDefaultTable WHERE ...

UPDATE MaTableCible
SET MonChampAMettreAjour = @MyDefValue
FROM MaTableSource
INNER JOIN inserted i ON MaTableSource.ID = i.ID

END

Utiliser la table inserted dans le trigger. Elle comprend les
enregistrements qui ont été insérés.

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France

"YDN" wrote in message
news:%
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 2