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

Développement SQL Server Discussion :

[Trigger] Génération d'erreurs dans un trigger


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 11
    Par défaut [Trigger] Génération d'erreurs dans un trigger
    Bonjour!

    Je souhaites générer dans la base de données (sql server 200) des erreurs personnalisées portant sur des règles d'intégrité genre truc bête "Si le champ [nom] est null, [prenom] doit être 'robert' ".
    ==> dc si on tente d'insérer une ligne dans ma table TablePersonnes, que le champ nom est null, et que prenom est 'toto' bien hop je balance une erreur sql comme celles que l'on rencontre dans nos requetes les plus extravagantes .

    Donc voici un petit bout de code qui illustre cette exemple :
    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
     
    CREATE  TRIGGER TRG_INSERT_COMPTES ON dbo.comptes
    AFTER  INSERT
    AS
     
    --bla bla bla bla et re bla
     
    IF((@type = 'e' AND @num_stu is null) AND @redirection is null)
    begin
    	--inspiré du web bien sûr ;)
                set @erreurDetectee = 1
    	RAISERROR (60002,10,1)
    	ROLLBACK TRANSACTION 
    end
     
    -- etc...
    (Remarque mes messages d'erreurs sont stockés dans la table Master.sysmessages)

    Donc bon je fais un test et cela plante bien le tout comme voulu non à cause de mon RAISERROR mais à cause du fait que je ne fait pas de transaction et dc que REROLL TRANSACTION n'a pas de BEGIN TRANSACTION... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    [Refmail_DataBase ; Comptes] : La valeur de [redirection] doit être non nulle si ([type]='e' et [num_stu] is null)
    [Refmail_DataBase ; Comptes] : La valeur de [redirection] doit être non nulle si ([type]='e' et [num_stu] is null)
    Serveur : Msg 3903, Niveau  16, État 1, Procédure TRG_INSERT_COMPTES, Ligne 81
    La requête ROLLBACK TRANSACTION n'a pas de BEGIN TRANSACTION correspondante.
    L'instruction a été arrêtée.

    Bon, ok, j'enlève mon REROLL TRANSACTION!!! MAis si je l'enlève du coup bien il n'y a plus de départ en erreur et le code continue son bout de chemin sans s'arrêter...

    Je voudrais simplement générer un message d'erreur dans mon trigger avant l'insertion si les conditions d'insertion ne sont pas remplies, et que le code s'arrête en raison de cette erreur et pas autre chose ^^.
    Genre ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [Refmail_DataBase ; Comptes] : La valeur de [redirection] doit être non nulle si ([type]='e' et [num_stu] is null)
    [Refmail_DataBase ; Comptes] : La valeur de [redirection] doit être non nulle si ([type]='e' et [num_stu] is null)
    L'instruction a été arrêtée.

    Merci de votre avis sur ce pitit problème comme dirai homer!

    +++

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 228
    Billets dans le blog
    25
    Par défaut
    Pourquoi faire ce type de check dans un trigger plutôt que dans un CHECK ?

    Etes-vous en mode chaîné ou non ? En mode par défaut, il vous faut des BEGIN TRAN explicites. En mode chaîné, il vous faudra des COMMIT explicites.

    Cf la commande

    Set implicit_transactions [on : off ]
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  3. #3
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Bonjour,

    Attention, tu sembles tomber dans l'erreur classique d'attribuer les valeurs de colonne à des variables dans un trigger. Le trigger peut traiter plusieurs lignes à la fois. Merci de poster le code complet du trigger, il n'y aura pas de gaspillage de papier.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 11
    Par défaut
    Bonjour,

    Merci de vos réponses.
    Alors voici le code complet de mon trigger pour commencer :

    (Pour résumer en étapes :
    -Déclaration des variables de stockage
    -Alimentation des variables
    -Les fameux tests d'intégrité
    -Une petite mise à jour à l'insertion
    )


    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
     
    SET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS ON 
    GO
     
     
    ALTER   TRIGGER TRG_INSERT_COMPTES ON dbo.comptes
    AFTER  INSERT
    AS
     
     
    declare @profil varchar(200)
    declare @adr_virtuelle varchar(200)
    declare @type varchar(200)
    declare @redirection varchar(200)
    declare @num_stu varchar(200)
    declare @id_user varchar(200)
    declare @service varchar(64)
    declare @programme varchar(50)
    declare @frontal varchar(50)
    declare @frontal_langue varchar(3)
    declare @forfait varchar(255)
    declare @domaine varchar(255)
    declare @samaccountname varchar(12)
    declare @login varchar(16)
    declare @pwd varchar(200)
    declare @nom varchar(26)
    declare @prenom varchar(64)
     
     
     
    /**********************************************************
    Vérification des règles d'intégrité
    **********************************************************/
    set @erreurDetectee = 0
    SELECT
    @profil = CI.profil,
    @type = CI.type,
    @redirection = CI.redirection,
    @num_stu = CI.num_stu,
    @id_user = CI.id_user,
    @service = CI.service,
    @programme = CI.programme,
    @frontal = frontal,
    @frontal_langue = frontal_langue,
    @forfait = forfait,
    @domaine = domaine,
    @samaccountname = samaccountname,
    @nom = nom,
    @prenom = prenom,
    @pwd = pwd,
    @login = login
    FROM inserted CI
     
     
    IF(@profil = 'virt' and @adr_virtuelle <> 'oui')
    begin
    	RAISERROR (60000,16,1)
    	--ROLLBACK TRANSACTION
    end
    IF(((@type = 'e' AND @num_stu is not null) OR (@type = 'c')) AND @redirection is not null)
    begin
    	RAISERROR (60001,16,1)
    	--ROLLBACK TRANSACTION 
    end
    IF((@type = 'e' AND @num_stu is null) AND @redirection is null)
    begin
    	RAISERROR (60002,16,1)
    	--ROLLBACK TRANSACTION 
    end
    IF((@type = 'e' AND @num_stu is null) AND @redirection is null)
    begin
    	RAISERROR (60002,16,1)
    	--ROLLBACK TRANSACTION 
    end
    IF (@profil = 'adm' OR @profil = 'prof' OR @profil = 'stu')
    begin
    	IF(@id_user is null)
    	begin
    		RAISERROR (60003,16,1)
    		--ROLLBACK TRANSACTION 
    	end
    	IF(@adr_virtuelle <> 'non')
    	begin
    		RAISERROR (60004,16,1)
    		--ROLLBACK TRANSACTION 
    	end
    	IF(@programme is null AND  @service is null)
    	begin
    		RAISERROR (60005,16,1)
    		--ROLLBACK TRANSACTION 
    	end
    end
    IF (@profil = 'adm' OR @profil = 'prof')
    begin
    	IF(@frontal is null OR @frontal_langue is null OR @forfait is null or @service is null OR @type is null)
    	begin
    		RAISERROR (60006,16,1)
    		--ROLLBACK TRANSACTION 
    	end
    	IF(@type <> 'c')
    	begin
    		RAISERROR (60007,16,1)
    		--ROLLBACK TRANSACTION 
    	end
    	IF(@frontal <> 'owa')
    	begin
    		RAISERROR (60008,16,1)
    		--ROLLBACK TRANSACTION 
    	end
    	IF(@forfait <> 'PC ET WEB 300Mo')
    	begin
    		RAISERROR (60009,16,1)
    		--ROLLBACK TRANSACTION 
    	end
    end
    IF (@profil = 'virt')
    begin
    	IF(@adr_virtuelle <> 'oui')
    	begin
    		RAISERROR (60010,16,1)
    		--ROLLBACK TRANSACTION 
    	end
    end
    IF (@profil = 'vac')
    begin
    	IF(@redirection is null)
    	begin
    		RAISERROR (60011,16,1)
    		--ROLLBACK TRANSACTION 
    	end
    	IF(@domaine <> 'grenoble-em.com')
    	begin
    		RAISERROR (60012,16,1)
    		--ROLLBACK TRANSACTION 
    	end
    end
    IF (@profil = 'stu')
    begin
    	IF(@redirection is not null)
    	begin
    		RAISERROR (60014,16,1)
    		--ROLLBACK TRANSACTION 
    	end
    	IF(@domaine <> 'grenoble-em.com')
    	begin
    		RAISERROR (60013,16,1)
    		--ROLLBACK TRANSACTION 
    	end
    end
    IF(@type = 'c')
    begin
    	IF @frontal <> 'owa'
    	begin
    		RAISERROR (60015,16,1)
    		--ROLLBACK TRANSACTION 
    	end
    	IF @forfait <> 'PC ET WEB 300Mo'
    	begin
    		RAISERROR (60016,16,1)
    		--ROLLBACK TRANSACTION 
    	end
    	IF @forfait <> 'PC ET WEB 300Mo'
    	begin
    		RAISERROR (60016,16,1)
    		--ROLLBACK TRANSACTION 
    	end
    	IF (@samaccountname is null or @nom is null or @prenom is null or @login is null or @pwd is null)
    	begin
    		RAISERROR (60017,16,1)
    		--ROLLBACK TRANSACTION 
    	end
     
    end
    IF(@type = 'e')
    begin
    	IF (@profil <> 'stu' and @profil <> 'vac')
    	begin
    		RAISERROR (60018,16,1)
    		--ROLLBACK TRANSACTION 
    	end
    	IF (@forfait is not null or @frontal is not null or @frontal_langue is not null)
    	begin
    		RAISERROR (60019,16,1)
    		--ROLLBACK TRANSACTION 
    	end
    	IF (@nom is null or @prenom is null)
    	begin
    		RAISERROR (60020,16,1)
    		--ROLLBACK TRANSACTION 
    	end
    end
     
    IF(@adr_virtuelle = 'oui')
    begin
    	IF (@type <> 'c')
    	begin
    		RAISERROR (60021,16,1)
    		--ROLLBACK TRANSACTION 
    	end
    end
     
    --Pas d'erreurs
    	UPDATE 
    	comptes 
    	SET 
    	comptes.statChange=1, 
    	comptes.calculMail = 1,
    	comptes.action=0, 
    	datecrea = CAST(GETDATE() AS smalldatetime),
    	date_lastmaj = CAST(GETDATE() AS smalldatetime)
    	FROM Comptes,inserted 
    	WHERE comptes.id_refmail = inserted.id_refmail
     
    GO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 11
    Par défaut
    "Pourquoi faire ce type de check dans un trigger plutôt que dans un CHECK ?"
    ==> Effectivement, je cherche peut être à me compliquer la vie ^^.

    Je vais me renseigner sur les CHECK pour voir si cela peut répondre à mes besoins

    Merci

    Je confirme le tout sous peu

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 11
    Par défaut
    Effectivement, je devrait pouvoir vérifier toutes ces contraintes en faisant des CHECK.
    La manière de les exprimer diffère, mais c'est réalisable .

    Merci encore pour vos précieuses indications

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur de syntaxe dans un trigger
    Par bastiii dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 10/09/2008, 08h47
  2. Erreur dans mon trigger ?
    Par Metalyn dans le forum PL/SQL
    Réponses: 3
    Dernier message: 11/02/2008, 20h27
  3. [PL/SQL] Erreur PLS-00103 dans un trigger
    Par sami.g dans le forum Oracle
    Réponses: 1
    Dernier message: 18/12/2006, 17h57
  4. Erreur dans TRIGGER
    Par taroudant dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 02/08/2006, 14h31
  5. Gestion des erreurs dans un TRIGGER
    Par SDU64 dans le forum DB2
    Réponses: 1
    Dernier message: 18/05/2006, 09h51

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