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 :

un trigger bloque ma table


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut un trigger bloque ma table
    (sql server 2005)

    Bonjour a tous,

    j'ai creer un trigger qui doit ecrir dans un fichier txt lorsque un INSERT est realisé sur une table specifique.

    J'ai une question et un probleme a vous soumettre.
    La question est:
    Le trigger porte sur la table_A qui se trouve sur la base B (par exemple)
    Dois je creer le trigger en me connectant d'abord a la base de données oB u se trouve ma table_A?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    use [base B]
     
    CREATE TRIGGER OVO_notification
    ON Table_A
    AFTER INSERT 
    AS
    Ou puis je creer le trigger connecté a Master et en faisant ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TRIGGER OVO_notification
    ON Base_B.Table_A
    AFTER INSERT 
    AS
    Et le probleme est que lorsque je creer le trigger, la table_A n'est plus mis a jour par l'application...Plus d'insert. Essayant de comprendre, j'ai droper le trigger et la, toutes les transactions se sont insertées d'un coup.
    Ensuite j'ai re creer le trigger et voila que ça recommence, plus d'insert.
    Est il possible que le trigger bloque les inserts sur la table?

    Je donne le code du 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
    39
    40
    41
    42
    43
    CREATE TRIGGER OVO_notification
    ON VE_event
    AFTER INSERT 
    AS
      DECLARE @cmd nvarchar(1024)
      DECLARE @OpC_MsgText nvarchar(1024)
      DECLARE @OpC_Severity nvarchar(20)
      DECLARE @View_EventID int
      DECLARE @View_EventType nvarchar(512)
      DECLARE @View_Module nvarchar(512)
      DECLARE @View_Severity nvarchar(512)
      DECLARE @View_EventMsg nvarchar(512)
      DECLARE @View_Time datetime
     
      SELECT @View_EventID = (SELECT EventID FROM INSERTED)
      SELECT @View_EventType = (SELECT EventType FROM INSERTED)
      SELECT @View_Module = (SELECT Module FROM INSERTED)
      SELECT @View_Severity = (SELECT Severity FROM INSERTED)
      SELECT @View_EventMsg = (SELECT ModuleAndEventText FROM INSERTED)
      SELECT @View_Time = (SELECT Time FROM INSERTED)
     
      SELECT @OpC_Severity =
        CASE
          WHEN @View_Severity ='INFO' THEN 'normal'
          WHEN @View_Severity ='WARNING' THEN 'warning'
          WHEN @View_Severity ='ERROR' THEN 'critical'
          WHEN @View_Severity ='AUDIT_SUCCESS' THEN 'normal'
          WHEN @View_Severity ='AUDIT_FAIL' THEN 'normal'
          ELSE 'critical'
        END;
     
      BEGIN TRY
        SET @OpC_MsgText = 'MSG: "' + @View_EventID + '|' + @View_EventType + '|' + @View_Module + '|' + @View_Severity + '|' + @View_EventMsg + '|' + @View_Time + '"'
        SET @cmd = 'echo ' + @OpC_MsgText + ' > E:\temp\VMwareView-events.txt'
        EXEC master..xp_cmdshell @cmd, no_output
      END TRY
      BEGIN CATCH
    	IF (XACT_STATE()) = -1  
    	BEGIN
    		ROLLBACK TRANSACTION;
    	END; 
      END CATCH;
    GO
    D'avance merci si vous avez des pistes.

  2. #2
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    il faut créer le trigger dans la base B.

    Rapidement, j'ai constaté une petite coquille dans ton code :

    Tu as déclaré la variable @View_EventID comme étant un entier, mais tu as oublié de la caster lors de la concaténation dans la chaine @OpC_MsgText. Il en est de même pour les autres variables non littérales.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DECLARE @View_EventID int
    SET @OpC_MsgText = 'MSG: "' + @View_EventID + '|' + @View_EventType + '|' + @View_Module + '|' + @View_Severity + '|' + @View_EventMsg + '|' + @View_Time + '"'

    Exemple renvoyant un message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE @View_EventID int
    DECLARE @OpC_MsgText nvarchar(1024)
    SET @View_EventID = 1
    SELECT @OpC_MsgText = 'MSG: "' + @View_EventID + '"'
    Message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg*245, Niveau*16, État*1, Ligne*4
    Échec de la conversion de la valeur varchar 'MSG: "' en type de données int.
    Etienne ZINZINDOHOUE
    Billets-Articles

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Salut Étienne

    Ça donnerait ceci alors? La syntaxe est OK ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @OpC_MsgText = 'MSG: "' + CAST(@View_EventID AS nvarchar) + '|' + @View_EventType + '|' + @View_Module + '|' + @View_Severity + '|' + @View_EventMsg + '|' + CAST(@View_Time as nvarchar)+ '"'
    Tu crois que c'est cette erreur qui bloque l'insertion de nouvelles lignes dans ma table_A?
    C'est incroyable non?

    Merci pour tes conseils.

  4. #4
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    Citation Envoyé par ldiaz Voir le message
    Salut Etienne

    Ça donnerait ceci alors? La sintaxe ext ok?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @OpC_MsgText = 'MSG: "' + CAST(@View_EventID AS nvarchar) + '|' + @View_EventType + '|' + @View_Module + '|' + @View_Severity + '|' + @View_EventMsg + '|' + CAST(@View_Time as nvarchar)+ '"'
    Tu crois que c'est cette erreur qui bloque l'insertion de nouvelles lignes dans ma table_A?
    C'est incroyable non?

    Merci pour tes conseils.
    Attention si tu utilises la fonction CAST (ou CONVERT) et que tu ne précises pas la longueur du type de données, alors il peut y avoir un problème si la longueur de la chaîne dépasse 30

    Après correction de la procédure, supprime et recrée le trigger sur la base B puis fait le test
    Etienne ZINZINDOHOUE
    Billets-Articles

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Ok
    c'est ça l'erreur...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', see "Surface Area Configuration" in SQL Server Books Online.

  6. #6
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    Citation Envoyé par ldiaz Voir le message
    Ok
    c'est ça l'erreur...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', see "Surface Area Configuration" in SQL Server Books Online.
    Il faut donc activer xp_cmdshell. Il faut exécuter ce lot de commandes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    --Activer les options avancées
    EXEC sp_configure 'show advanced options', 1
    GO
    RECONFIGURE
    GO
    -- Activer xp_cmdshell
    EXEC sp_configure 'xp_cmdshell', 1
    GO
    -- Prise en compte de la configuration
    RECONFIGURE
    GO
    Etienne ZINZINDOHOUE
    Billets-Articles

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/06/2007, 11h11
  2. créer TRIGGER sur 1 table avec liaison sur 2 autre table
    Par shaka84 dans le forum Développement
    Réponses: 2
    Dernier message: 11/04/2006, 11h10
  3. trigger createur de table sous mysql
    Par lours85 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 20/02/2006, 11h53
  4. pb trigger avec nested table
    Par evlad dans le forum Oracle
    Réponses: 1
    Dernier message: 29/12/2005, 12h04
  5. trigger sur deux tables
    Par Shabata dans le forum Développement
    Réponses: 4
    Dernier message: 04/05/2004, 16h55

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