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 pour copie valeur d'une table à une autre plus tri par desc


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Août 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Août 2016
    Messages : 29
    Points : 22
    Points
    22
    Par défaut Trigger pour copie valeur d'une table à une autre plus tri par desc
    Bonjour

    J'ai une table BHD avec auto increment dans SQL 2008 , chaque ligne est généré une fois au moment du lancement du data logging ... J'ai une une autre table 'DLG ' qui elle créent des ligne en fonction du temps d'utilisation du data logging

    J'aimerai récupérer la valeur batch de BHD et la mettre dans batch de DLG afin d'avoir une relation entre les tables

    Il faut que j'utilise en permanence la valeur la plus haute de batch ID de BHD

    Voici mon trigger non fonctionnel( pourquoi ?) sur DLG :

    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
    USE [Dexline]
    GO
    /****** Object:  Trigger [dbo].[CopyBatchFromBHD]    Script Date: 03/06/2017 11:11:06 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
     
    -- =============================================
    ALTER TRIGGER  [dbo].[CopyBatchFromBHD]
       ON  [dbo].[DLG]
       AFTER INSERT
    AS 
    BEGIN
     
    		Declare @BatchID bigint
    		Declare @BatchIDMax bigint
     
    		SELECT [BHD_BHD_BTCH_BatchID_value] from [BHD]where [BHD_BHD_BTCH_BatchID_value] = @BatchID order by [BHD_BHD_BTCH_BatchID_value] desc 
     
     
     
    	Update [DLG]
     
    	set
    	  @BatchIDMax = @BatchID,
     
    	  [DLG_BTCH_BatchID_value] = @BatchIDMax
     
     
     
     
    END
    Pour informations je suis débutant sur SQL

    Merci pour votre aide précieuse !

  2. #2
    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,

    Il y a plusieurs écueils dans le code de ce trigger :

    • Il n'y a pas de référence à la table virtuelle INSERTED
    • Dans le SELECT, on a where [BHD_BHD_BTCH_BatchID_value] = @BatchID, mais @BatchID n'a pas de valeur, donc la requête ne ramène aucune ligne
    • Dans l'UPDATE, on a set @BatchIDMax = @BatchID : on affecte la valeur d'une variable à une autre, ce qui n'affecte donc aucune colonne de la table DLG.


    La table virtuelle INSERTED reflète les lignes que l'on vient d'insérer dans la table (i.e. sur INSERT et UPDATE : nouvelles valeurs)
    Par extension, la table virtuelle DELETED reflète les lignes que l'on vient de supprimer de la table (i.e. sur DELETE et UPDATE : anciennes valeurs)

    Le trigger devrait voir son code ressembler au squelette suivant :

    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
    ALTER TRIGGER  [dbo].[CopyBatchFromBHD]
       ON  [dbo].[DLG]
       AFTER INSERT
    AS 
    BEGIN
    	SET NOCOUNT ON
     
    	DECLARE @BatchID bigint
     
    	SELECT		@BatchID = MAX(BHD_BHD_BTCH_BatchID_value)
    	FROM		dbo.BHD AS B
    	INNER JOIN	INSERTED AS I
    				ON B.??? = I.??? 
     
    	UPDATE dbo.DLG
     	SET	colonne = @BatchID 
    	WHERE	DLG_BTCH_BatchID_value = @BatchID 
    END
    Ce trigger doit-il être sur la table DLG ? A partir du code que vous donnez, il semblerait qu'il faille qu'il soit attaché à la table BHD.

    Un peu de lecture sur les triggers par ici, ou dans le livre référencé dans ma signature, plus complet.

    @++

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    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 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Ceci ne marchera jamais et pour 2 raisons :
    1) les déclencheurs sont par nature ensembliste et donc ne voient pas passer une ligne mais DES lignes.
    2) aucune garantie que la valeur maximum donne la valeur attendue pour votre session du fait de la concurrence d'accès (vous êtes pas tout seul sur le 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/ * * * * *

  4. #4
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Août 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Août 2016
    Messages : 29
    Points : 22
    Points
    22
    Par défaut Merci pour vos réponse
    Oui le souci est que lorsque que je lance mon OPC , dans la table BHD il me généré juste une ligne (se sont des informations de recettes ...), mais à ce même moment dans la table "DLG" il se met à jour toutes les 100 ms par l'OPC. jusqu'à ça coupure
    Donc au départ avant d'utilisé le trigger , lorsque je lançais mon OPC j'utilisais un module pour récupéré la valeur venant de BHD (batchId) pour remettre dans DLG la même valeur .

    Et si j'utilise le Before dans mon trigger cela fonctionnerait-il ?

    Merci

  5. #5
    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
    Les triggers BEFORE n'existent pas sous SQL Server. En fait, avec la pratique, on s'aperçoit qu'on n'en a pas besoin.

    @++

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Je ne suis pas sûr de bien comprendre le besoin, mais il me semble qu'il vous suffit, lors de la première insertion dans la table BHD, de récupérer l'identifiant auto-généré avec SCOPE_IDENTITY, puis de l'utiliser lors des insertions dans l'autre table...

Discussions similaires

  1. [Vxi3] Requête Valeurs sans occurrences d'une table à l'autre
    Par DamienBC dans le forum Designer
    Réponses: 1
    Dernier message: 16/12/2013, 15h32
  2. Copie d'un champ d'une table à une autre
    Par dodo91 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 13/05/2009, 11h29
  3. Copie d'une table à une autre
    Par papipasto dans le forum Requêtes
    Réponses: 1
    Dernier message: 21/03/2006, 17h02
  4. Réponses: 2
    Dernier message: 16/02/2006, 23h09
  5. Copie de fichiers XLS dans une table
    Par sebvita dans le forum Oracle
    Réponses: 3
    Dernier message: 28/12/2005, 09h13

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