IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

comment fonctionne trigger instead of insert ?


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Octobre 2008
    Messages : 41
    Points : 32
    Points
    32
    Par défaut comment fonctionne trigger instead of insert ?
    Salut

    j'ai créé un trigger sur une table afin de ne pas enregistrer une requête qui comprend le prénom 'test'

    voila ma table

    personne (idp, nom, prenom)

    et voila mon trigger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    create trigger tt on personne instead of insert as 
    begin
     
    if (select prenom from inserted) = 'test' 
    begin
      print 'erreur'
      rollback -- afin de stopper l'enregistrement
    end
     
    else
    begin
      print 'ok'
    end
     
    end
    après j'ai testé cette requête :
    insert into personne values(2, 'hhlkjh', 'jkhkh')

    en l'exécutant ça m'affiche ok, une ligne affectée

    mais quand je fait "select * from personne" l'enregistrement n'y pas !!!! c'est comme s'il est ignoré ....

    comment résoudre ce problème svp ?

    merci d'avance

  2. #2
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonjour,

    Plutôt que d'utiliser un trigger instead of, toujours piégieux, vous pourriez utiliser une contrainte, qui s'applique avant l'insertion, au contraire du trigger.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE dbo.personne ADD CONSTRAINT
    CK_personne CHECK NOT FOR REPLICATION (prenom <> 'test')
    Au niveau du trigger, instead of signifie que vous remplacez totalement le traitement: Il vous faut coder l'insert.

    Une petite remarque sur ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF (SELECT prenom FROM inserted) = 'test'
    Ce code assume qu'il n'y aura toujours qu'une seule ligne dans inserted. Une insertion de deux lignes ne fonctionnera pas :-(

    @+

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Je rejoins la réponse de agmis31 : une contrainte CHECK remplira impeccablement ce rôle.

    Néanmoins, si vous voulez voir votre trigger fonctionner proprement (en SQL Server)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    CREATE TRIGGER TR_IOF_I_personne
    	ON dbo.personne
    	INSTEAD OF INSERT
    AS 
    BEGIN 
    	IF EXISTS
    	(
    		SELECT *
    		FROM INSERTED
    		WHERE prenom = 'test'
    	)
    	BEGIN
    		RAISERROR('Le prénom ne peut pas être test !!!', 16, 1)
    		ROLLBACK -- afin de stopper l'enregistrement
    	END	 
    	ELSE
    	BEGIN
    		INSERT INTO dbo.personne
    		(
    			mesColonnes
    		)
    		SELECT mesColonnes
    		FROM INSERTED
    	END 
    END
    @++

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    Dans le principe, le trigger INSTEAD OF comme son nom l'indique propose de faire autre chose que la demande originelle (INSERT, UPDATE ou DELETE).

    Cela est essentiellement intéressant pour des vues qui peuvent ne pas permettre la mise à jour comme je l'ai expliqué au page 7 (Dernier exemple) de cet article : http://sqlpro.developpez.com/SGBDR/R...egles_codd.pdf

    En fait cela sert à gérer le mapping RO côté SGBDR.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Autre question sur les Triggers INSTEAD OF INSERT
    Bonjour,

    Je ne vois pas comment créer dans une table de manière performante une colonne qui est calculée automatiquement à l'insert d'un nouvel élément à partir du dernier élément inséré.

    Je m'explique: j'aimerais comme dans l'exemple suivant calculer automatiquement la colonne "Somme" à chaque nouvel insert, sachant que je ne ferai jamais de supression et donc ce calcul peut être persistent...

    Exemple lors de l'ajout du 4eme element:

    Table avant insert:
    ID Val Somme
    1 0.5 0.5
    2 0.1 0.6
    3 1.2 1.8
    4 0.5 ???????

    Je pensais partir sur une colonne calculée ou un trigger INSTEAD OF...
    Pourriez-vous me donner votre avis?

    Merci!

  6. #6
    Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut J'ai fini par faire un trigger...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    CREATE TRIGGER TriggerCalcEvolution
    ON dbo.Games
    INSTEAD OF INSERT AS
    BEGIN
    	--Création d'une variable pour calculer ma colonne 'Somme'
    	DECLARE @NewCash AS real
     
    	--Si je n'ai aucun enregistrement, je somme mes 2 valeurs CashWin et CashLoose
    	SET @NewCash=(SELECT TOP(1) CashWin+CashLoose FROM Inserted)
    	-- Si j'ai déjà des enregistrements, je récupère mon précédent calcul
    	IF 0<(SELECT count(SessionID) FROM Games )
    		SET @NewCash=(SELECT TOP(1) Cash+@NewCash FROM Games ORDER BY SessionID DESC)
     
    	--J'insere finallement tous les champs d'origine + celui que je viens de calculer
    	INSERT INTO Games WITH (TABLOCK)
    	(
    		SessionID,
    		Occurtime,
    		Opponent,
    		GameType,
    		DiceCube,
    		CashWin,
    		CashLoose,
    		Cash
    	)
    	SELECT
    		TOP (1) SessionID,
    		Occurtime,
    		Opponent,
    		GameType,
    		DiceCube,
    		CashWin,
    		CashLoose,
    		@NewCash
    	FROM
    		Inserted
    	ORDER BY SessionID DESC
    END
    May it help!

Discussions similaires

  1. trigger instead of insert
    Par smash dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 26/08/2009, 20h07
  2. SqlBulkCopy & Trigger instead of INSERT
    Par Nono3013 dans le forum Développement
    Réponses: 4
    Dernier message: 07/11/2008, 21h00
  3. Création d'un trigger INSTEAD OF INSERT
    Par LestoK dans le forum Développement
    Réponses: 4
    Dernier message: 03/09/2008, 13h53
  4. Réponses: 32
    Dernier message: 21/08/2008, 12h27
  5. [SQL2K] TRIGGER - Instead of Insert
    Par buchette dans le forum Développement
    Réponses: 3
    Dernier message: 04/06/2008, 17h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo