Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Insertion Multiple dans un Trigger

9 réponses
Avatar
Saulot
Bonjour,
Voila le problème.

Dans un Trigger sur le DELETE d'une table, je souhaite inserer les valeurs
des enregistrements dans une table historique par le biais d'un INSERT.
En bref, je voudrais un trigger de ce style :

Pour chaque enregistrement surrpimé
INSERT INTO THisto (NomdeMatable,Chaine de caracteres contenant les
valeurs de l'enregistrement, Date du jour)

Est-ce possible ?

Merci de votre aide.

9 réponses

Avatar
Saulot
Bon ben on est parti pour un Curseur....

"Saulot" a écrit dans le message de news:
40864c3b$0$17485$
Bonjour,
Voila le problème.

Dans un Trigger sur le DELETE d'une table, je souhaite inserer les valeurs
des enregistrements dans une table historique par le biais d'un INSERT.
En bref, je voudrais un trigger de ce style :

Pour chaque enregistrement surrpimé
INSERT INTO THisto (NomdeMatable,Chaine de caracteres contenant les
valeurs de l'enregistrement, Date du jour)

Est-ce possible ?

Merci de votre aide.




Avatar
Fred BROUARD
oui !

Quelsues exemples de triggers :
http://sqlpro.developpez.com/TransactSQL/SQL_MSTransactSQL.html#5.4" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com/TransactSQL/SQL_MSTransactSQL.html#5.4

A +

Saulot a écrit:
Bonjour,
Voila le problème.

Dans un Trigger sur le DELETE d'une table, je souhaite inserer les valeurs
des enregistrements dans une table historique par le biais d'un INSERT.
En bref, je voudrais un trigger de ce style :

Pour chaque enregistrement surrpimé
INSERT INTO THisto (NomdeMatable,Chaine de caracteres contenant les
valeurs de l'enregistrement, Date du jour)

Est-ce possible ?

Merci de votre aide.





--
Frédéric BROUARD, MVP Microsoft SQL Server. Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************
Avatar
Saulot
Bonjour,
Pourriez vous jeter un coup d'oeil à mon "horrible" trigger ^^

CREATE TRIGGER TAuteursDelete ON dbo.TAuteurs
FOR DELETE
AS
DECLARE @cAuteur Varchar(50)
DECLARE @cSociete Varchar(50)
DECLARE @Nom Varchar(50)
DECLARE @Prenom Varchar(50)
DECLARE @Tag Varchar(50)
DECLARE @IISACreate Bit
DECLARE @DateCreate DateTime
DECLARE @DateEdit DateTime
DECLARE @Request Varchar(5000)
DECLARE MyCurseur CURSOR FOR SELECT * FROM Deleted
OPEN MyCurseur
IF @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM MyCurseur INTO
@cAuteur,@cSociete,@Nom,@Prenom,@Tag,@IISACreate,@DateCreate,@DateEdit
WHILE @@FETCH_STATUS=0
BEGIN
Select @Request='INSERT INTO TAuteurs VALUES (''' + @cAuteur + ''',''' +
@cSociete + ''',''' + @Nom + ''',''' + @Prenom + ''',''' + @Tag + ''',' +
CONVERT(Varchar(20),@IISACreate) + ',''' + CONVERT(Varchar(20),@DateCreate)
+ ''',''' + CONVERT(Varchar(20),@DateEdit) + ''')'
INSERT INTO TSuppressions VALUES(TAuteurs,@Request,current_timestamp)
FETCH NEXT FROM MyCurseur INTO
@cAuteur,@cSociete,@Nom,@Prenom,@Tag,@IISACreate,@DateCreate,@DateEdit
END
END
CLOSE MyCurseur
DEALLOCATE MyCurseur
GO

"Fred BROUARD" a écrit dans le message de news:
#3GCz#
oui !

Quelsues exemples de triggers :
http://sqlpro.developpez.com/TransactSQL/SQL_MSTransactSQL.html#5.4" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com/TransactSQL/SQL_MSTransactSQL.html#5.4

A +

Saulot a écrit:
> Bonjour,
> Voila le problème.
>
> Dans un Trigger sur le DELETE d'une table, je souhaite inserer les


valeurs
> des enregistrements dans une table historique par le biais d'un INSERT.
> En bref, je voudrais un trigger de ce style :
>
> Pour chaque enregistrement surrpimé
> INSERT INTO THisto (NomdeMatable,Chaine de caracteres contenant les
> valeurs de l'enregistrement, Date du jour)
>
> Est-ce possible ?
>
> Merci de votre aide.
>
>

--
Frédéric BROUARD, MVP Microsoft SQL Server. Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************



Avatar
bruno reiter [MVP]
pourquoi un curseur???

INSERT HISTO
(col1.....)
SELECT col1 .......
FROM deleted

br

"Saulot" wrote in message
news:40865376$0$17488$
Bon ben on est parti pour un Curseur....

"Saulot" a écrit dans le message de news:
40864c3b$0$17485$
> Bonjour,
> Voila le problème.
>
> Dans un Trigger sur le DELETE d'une table, je souhaite inserer les


valeurs
> des enregistrements dans une table historique par le biais d'un INSERT.
> En bref, je voudrais un trigger de ce style :
>
> Pour chaque enregistrement surrpimé
> INSERT INTO THisto (NomdeMatable,Chaine de caracteres contenant les
> valeurs de l'enregistrement, Date du jour)
>
> Est-ce possible ?
>
> Merci de votre aide.
>
>




Avatar
Fred BROUARD
salut,

une petit conseil : faire de la traçabilité n'a de sens que si l'on s'en
sert et les triggers ont un coût de traitement les plus élevés qui soit.

En conclusion, si la traçabilité des delete n'est pas nécessaire alors
abandonne là telle qu'elle est pensée et simplifie tes curseurs.

Si la traçabilité est nécessaire, alors modifie la structure et passe à
quelque chose de plus performant.

Par exemple au lieu d'une super table TSuppressions, créé autant de
table de DELETE UPDATE que de table à tracer, avec la même structure et
les colonnes :
TYPE_EVENEMENT CHAR(1), DATEHEURE_EVENEMENT (DATETIME) en sus

Dans le cas d'une suppression dans TAuteurs, le trigger devient :

INSERT INTO TAuteurDelUpd
SELECT *, 'D', CURRENT_TIMESTAMP
FROM DELETED

C'est tout !!!

La table TAuteurDelUps étant la table d'historisation des updates/delete
pour la table TAUteurs

De plus cela sera nettement plus rapide
Enfin cela sera beaucoup plus facile pour retrouver l'information, car
pour voir tout l'historique d'une entrée de données, tu pourra faire :

SELECT *, NULL, CURRENT_TIMESTAMP
FROM TAuteurs
UNION
SELECT *, NULL, CURRENT_TIMESTAMP
FROM TAuteursDelUpd


A +


--
Frédéric BROUARD, MVP Microsoft SQL Server. Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com/bookSQL.html" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com
****************** mailto: ******************


Saulot a écrit:
Bonjour,
Pourriez vous jeter un coup d'oeil à mon "horrible" trigger ^^

CREATE TRIGGER TAuteursDelete ON dbo.TAuteurs
FOR DELETE
AS
DECLARE @cAuteur Varchar(50)
DECLARE @cSociete Varchar(50)
DECLARE @Nom Varchar(50)
DECLARE @Prenom Varchar(50)
DECLARE @Tag Varchar(50)
DECLARE @IISACreate Bit
DECLARE @DateCreate DateTime
DECLARE @DateEdit DateTime
DECLARE @Request Varchar(5000)
DECLARE MyCurseur CURSOR FOR SELECT * FROM Deleted
OPEN MyCurseur
IF @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM MyCurseur INTO
@cAuteur,@cSociete,@Nom,@Prenom,@Tag,@IISACreate,@DateCreate,@DateEdit
WHILE @@FETCH_STATUS=0
BEGIN
Select @Request='INSERT INTO TAuteurs VALUES (''' + @cAuteur + ''',''' +
@cSociete + ''',''' + @Nom + ''',''' + @Prenom + ''',''' + @Tag + ''',' +
CONVERT(Varchar(20),@IISACreate) + ',''' + CONVERT(Varchar(20),@DateCreate)
+ ''',''' + CONVERT(Varchar(20),@DateEdit) + ''')'
INSERT INTO TSuppressions VALUES(TAuteurs,@Request,current_timestamp)
FETCH NEXT FROM MyCurseur INTO
@cAuteur,@cSociete,@Nom,@Prenom,@Tag,@IISACreate,@DateCreate,@DateEdit
END
END
CLOSE MyCurseur
DEALLOCATE MyCurseur
GO

"Fred BROUARD" a écrit dans le message de news:
#3GCz#

oui !

Quelsues exemples de triggers :
http://sqlpro.developpez.com" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com/TransactSQL/SQL_MSTransactSQL.html#5.4

A +

Saulot a écrit:

Bonjour,
Voila le problème.

Dans un Trigger sur le DELETE d'une table, je souhaite inserer les





valeurs

des enregistrements dans une table historique par le biais d'un INSERT.
En bref, je voudrais un trigger de ce style :

Pour chaque enregistrement surrpimé
INSERT INTO THisto (NomdeMatable,Chaine de caracteres contenant les
valeurs de l'enregistrement, Date du jour)

Est-ce possible ?

Merci de votre aide.





--
Frédéric BROUARD, MVP Microsoft SQL Server. Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com/bookSQL.html" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com
****************** mailto: ******************








Avatar
christophe
evite un curseur tres gourmand en ressource et en vitesse
et utilise la requeste d'insertion classique avec un select sur la table
deleted !!

comme indiqué par bruno.




"Saulot" a écrit dans le message de
news:40865723$0$17497$
Bonjour,
Pourriez vous jeter un coup d'oeil à mon "horrible" trigger ^^

CREATE TRIGGER TAuteursDelete ON dbo.TAuteurs
FOR DELETE
AS
DECLARE @cAuteur Varchar(50)
DECLARE @cSociete Varchar(50)
DECLARE @Nom Varchar(50)
DECLARE @Prenom Varchar(50)
DECLARE @Tag Varchar(50)
DECLARE @IISACreate Bit
DECLARE @DateCreate DateTime
DECLARE @DateEdit DateTime
DECLARE @Request Varchar(5000)
DECLARE MyCurseur CURSOR FOR SELECT * FROM Deleted
OPEN MyCurseur
IF @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM MyCurseur INTO
@cAuteur,@cSociete,@Nom,@Prenom,@Tag,@IISACreate,@DateCreate,@DateEdit
WHILE @@FETCH_STATUS=0
BEGIN
Select @Request='INSERT INTO TAuteurs VALUES (''' + @cAuteur + ''',''' +
@cSociete + ''',''' + @Nom + ''',''' + @Prenom + ''',''' + @Tag + ''',' +
CONVERT(Varchar(20),@IISACreate) + ',''' +


CONVERT(Varchar(20),@DateCreate)
+ ''',''' + CONVERT(Varchar(20),@DateEdit) + ''')'
INSERT INTO TSuppressions VALUES(TAuteurs,@Request,current_timestamp)
FETCH NEXT FROM MyCurseur INTO
@cAuteur,@cSociete,@Nom,@Prenom,@Tag,@IISACreate,@DateCreate,@DateEdit
END
END
CLOSE MyCurseur
DEALLOCATE MyCurseur
GO

"Fred BROUARD" a écrit dans le message de


news:
#3GCz#
> oui !
>
> Quelsues exemples de triggers :
> http://sqlpro.developpez.com/TransactSQL/SQL_MSTransactSQL.html#5.4" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com/TransactSQL/SQL_MSTransactSQL.html#5.4
>
> A +
>
> Saulot a écrit:
> > Bonjour,
> > Voila le problème.
> >
> > Dans un Trigger sur le DELETE d'une table, je souhaite inserer les
valeurs
> > des enregistrements dans une table historique par le biais d'un


INSERT.
> > En bref, je voudrais un trigger de ce style :
> >
> > Pour chaque enregistrement surrpimé
> > INSERT INTO THisto (NomdeMatable,Chaine de caracteres contenant


les
> > valeurs de l'enregistrement, Date du jour)
> >
> > Est-ce possible ?
> >
> > Merci de votre aide.
> >
> >
>
> --
> Frédéric BROUARD, MVP Microsoft SQL Server. Langage SQL / Delphi / web
> Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com/bookSQL.html
> Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
> ****************** mailto: ******************
>




Avatar
Saulot
Je vois bien les avantages de vos propositions.
Hélas je ne suis pas le maitre à bord et les changements que vous me
suggerez ne seront certainement pas du gout de mon super superieur !
Quoi qu'il en soit, comme on dit, je me coucherais moins con ce soir ^^

Merci de vos conseils.

"Saulot" a écrit dans le message de news:
40865723$0$17497$
Bonjour,
Pourriez vous jeter un coup d'oeil à mon "horrible" trigger ^^

CREATE TRIGGER TAuteursDelete ON dbo.TAuteurs
FOR DELETE
AS
DECLARE @cAuteur Varchar(50)
DECLARE @cSociete Varchar(50)
DECLARE @Nom Varchar(50)
DECLARE @Prenom Varchar(50)
DECLARE @Tag Varchar(50)
DECLARE @IISACreate Bit
DECLARE @DateCreate DateTime
DECLARE @DateEdit DateTime
DECLARE @Request Varchar(5000)
DECLARE MyCurseur CURSOR FOR SELECT * FROM Deleted
OPEN MyCurseur
IF @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM MyCurseur INTO
@cAuteur,@cSociete,@Nom,@Prenom,@Tag,@IISACreate,@DateCreate,@DateEdit
WHILE @@FETCH_STATUS=0
BEGIN
Select @Request='INSERT INTO TAuteurs VALUES (''' + @cAuteur + ''',''' +
@cSociete + ''',''' + @Nom + ''',''' + @Prenom + ''',''' + @Tag + ''',' +
CONVERT(Varchar(20),@IISACreate) + ',''' +


CONVERT(Varchar(20),@DateCreate)
+ ''',''' + CONVERT(Varchar(20),@DateEdit) + ''')'
INSERT INTO TSuppressions VALUES(TAuteurs,@Request,current_timestamp)
FETCH NEXT FROM MyCurseur INTO
@cAuteur,@cSociete,@Nom,@Prenom,@Tag,@IISACreate,@DateCreate,@DateEdit
END
END
CLOSE MyCurseur
DEALLOCATE MyCurseur
GO

"Fred BROUARD" a écrit dans le message de


news:
#3GCz#
> oui !
>
> Quelsues exemples de triggers :
> http://sqlpro.developpez.com/TransactSQL/SQL_MSTransactSQL.html#5.4" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com/TransactSQL/SQL_MSTransactSQL.html#5.4
>
> A +
>
> Saulot a écrit:
> > Bonjour,
> > Voila le problème.
> >
> > Dans un Trigger sur le DELETE d'une table, je souhaite inserer les
valeurs
> > des enregistrements dans une table historique par le biais d'un


INSERT.
> > En bref, je voudrais un trigger de ce style :
> >
> > Pour chaque enregistrement surrpimé
> > INSERT INTO THisto (NomdeMatable,Chaine de caracteres contenant


les
> > valeurs de l'enregistrement, Date du jour)
> >
> > Est-ce possible ?
> >
> > Merci de votre aide.
> >
> >
>
> --
> Frédéric BROUARD, MVP Microsoft SQL Server. Langage SQL / Delphi / web
> Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com/bookSQL.html
> Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
> ****************** mailto: ******************
>




Avatar
Fred
Bonjour,

Une petite question à propos de la ligne de code que vous
proposez:
INSERT HISTO
(col1.....)
SELECT col1 .......
FROM deleted




J'ai essayé, mais j'ai droit à un message d'erreur lors
de la validation du curseur :
"Erreur 311 : Impossible d'utiliser les colonnes text,
ntext ou image dans les tables Inserted et deleted"

En fait j'essaye de copier l'enregistrement que je suis
en train d'ajouter dans une autre table.

Voici mon Trigger :

"CREATE TRIGGER [tr_inserted_commande] ON [dbo].
[commandes]
FOR INSERT
AS
INSERT INTO
inserted_commande (CodeCommande, DateCommande,
HeureCommande, CodeClient, ReferenceClient,
DonneurDOrdre, Destination, CodeVariante,
CodeSurveillance, QuestionsSpeciales, Motif,
Confidentiel, CoutUnites, Abonnement, FinDeMois,
CodeEntrepriseCible )
SELECT CodeCommande, DateCommande, HeureCommande,
CodeClient, ReferenceClient, DonneurDOrdre, Destination,
CodeVariante, CodeSurveillance, QuestionsSpeciales,
Motif, Confidentiel, CoutUnites, Abonnement, FinDeMois,
CodeEntrepriseCible FROM inserted"

Est ce qu'effectivement, il n'y a pas moyen d'accéder aux
champs text de la table "inserted" ou me suis je tromper
dans ma syntaxe ?

Merci d'avance

Fred





-----Message d'origine-----
pourquoi un curseur???

INSERT HISTO
(col1.....)
SELECT col1 .......
FROM deleted

br

"Saulot" wrote in message
news:40865376$0$17488$
Bon ben on est parti pour un Curseur....

"Saulot" a écrit dans le




message de news:
40864c3b$0$17485$
> Bonjour,
> Voila le problème.
>
> Dans un Trigger sur le DELETE d'une table, je




souhaite inserer les
valeurs
> des enregistrements dans une table historique par le




biais d'un INSERT.
> En bref, je voudrais un trigger de ce style :
>
> Pour chaque enregistrement surrpimé
> INSERT INTO THisto (NomdeMatable,Chaine de




caracteres contenant les
> valeurs de l'enregistrement, Date du jour)
>
> Est-ce possible ?
>
> Merci de votre aide.
>
>






.



Avatar
bruno reiter [MVP]
tu ne peux pas accéder aux colonnes text, ntext, image

si tu as VRAIMENT besoin d'historiser, utilises une procédure stockée

br

"Fred" wrote in message
news:2c3c01c4286b$c8a58940$
Bonjour,

Une petite question à propos de la ligne de code que vous
proposez:
INSERT HISTO
(col1.....)
SELECT col1 .......
FROM deleted




J'ai essayé, mais j'ai droit à un message d'erreur lors
de la validation du curseur :
"Erreur 311 : Impossible d'utiliser les colonnes text,
ntext ou image dans les tables Inserted et deleted"

En fait j'essaye de copier l'enregistrement que je suis
en train d'ajouter dans une autre table.

Voici mon Trigger :

"CREATE TRIGGER [tr_inserted_commande] ON [dbo].
[commandes]
FOR INSERT
AS
INSERT INTO
inserted_commande (CodeCommande, DateCommande,
HeureCommande, CodeClient, ReferenceClient,
DonneurDOrdre, Destination, CodeVariante,
CodeSurveillance, QuestionsSpeciales, Motif,
Confidentiel, CoutUnites, Abonnement, FinDeMois,
CodeEntrepriseCible )
SELECT CodeCommande, DateCommande, HeureCommande,
CodeClient, ReferenceClient, DonneurDOrdre, Destination,
CodeVariante, CodeSurveillance, QuestionsSpeciales,
Motif, Confidentiel, CoutUnites, Abonnement, FinDeMois,
CodeEntrepriseCible FROM inserted"

Est ce qu'effectivement, il n'y a pas moyen d'accéder aux
champs text de la table "inserted" ou me suis je tromper
dans ma syntaxe ?

Merci d'avance

Fred





-----Message d'origine-----
pourquoi un curseur???

INSERT HISTO
(col1.....)
SELECT col1 .......
FROM deleted

br

"Saulot" wrote in message
news:40865376$0$17488$
Bon ben on est parti pour un Curseur....

"Saulot" a écrit dans le




message de news:
40864c3b$0$17485$
> Bonjour,
> Voila le problème.
>
> Dans un Trigger sur le DELETE d'une table, je




souhaite inserer les
valeurs
> des enregistrements dans une table historique par le




biais d'un INSERT.
> En bref, je voudrais un trigger de ce style :
>
> Pour chaque enregistrement surrpimé
> INSERT INTO THisto (NomdeMatable,Chaine de




caracteres contenant les
> valeurs de l'enregistrement, Date du jour)
>
> Est-ce possible ?
>
> Merci de votre aide.
>
>






.