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 :

SQL TRIGGER Nom Colonne


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2003
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Septembre 2003
    Messages : 401
    Par défaut SQL TRIGGER Nom Colonne
    Bonjour

    Imaginez que j'ai 2 tables A et B de structure identique.
    on va dire ID, Nom, Prenom, Age, Adresse,...

    Je dois comparer la valeur de leur champ mais pour une liste de champ contenu dans une table C.

    c'est à dire que dans la table C je peux avoir
    Nom
    Prenom

    Dans ce cas je devrais comparer seulement les champs Nom et prenom de la table A et B.

    Si une des valeurs est différentes alors j'exécute une autre action


    perso Je m'arrache les cheveux

  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 : 43
    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
    Par défaut
    Bonjour,

    Voici comment vous pourriez faire :

    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
    CREATE TABLE A
    (
    	ID INT IDENTITY CONSTRAINT PK_A PRIMARY KEY,
    	Nom VARCHAR(20) NOT NULL,
    	Prenom VARCHAR(20) NOT NULL,
    	Age TINYINT NOT NULL CONSTRAINT DF_A_Age DEFAULT 0 CONSTRAINT CHK_A_Age CHECK(Age <= 100) ,
    	Adresse VARCHAR(100) NOT NULL
    )
    GO
     
    INSERT INTO dbo.A VALUES ('Nom1', 'Prenom1', 10, '10 rue du Yaourt, 31000 Toulouse')
    INSERT INTO dbo.A VALUES ('Nom2', 'Prenom2', 20, '20 rue du Yaourt, 31000 Toulouse')
    INSERT INTO dbo.A VALUES ('Nom3', 'Prenom3', 30, '30 rue du Yaourt, 31000 Toulouse')
    INSERT INTO dbo.A VALUES ('Nom4', 'Prenom4', 40, '40 rue du Yaourt, 31000 Toulouse')
    INSERT INTO dbo.A VALUES ('Nom5', 'Prenom5', 50, '50 rue du Yaourt, 31000 Toulouse')
    GO
     
    SELECT *
    INTO dbo.B
    FROM dbo.A
    GO
     
    ALTER TABLE dbo.B
    ADD CONSTRAINT PK_B PRIMARY KEY (ID),
    	CONSTRAINT DF_B_Age DEFAULT 0 FOR Age,
    	CONSTRAINT CHK_B_Age CHECK(Age <= 100)
    GO
     
    -- Vérifie qu'un nom de colonne qui sera stocké dans C est bien une des colonnes de la table A
    CREATE FUNCTION Fn_EstColonneDansTable (@nomColonne SYSNAME)
    	RETURNS BIT
    AS
    BEGIN
    	DECLARE @estColonneDansTable BIT
     
    	SELECT @estColonneDansTable = 1
    	FROM sys.columns C
    	JOIN sys.tables T ON T.object_id = C.object_id
    	WHERE T.name = 'A'
    	AND C.name = @nomColonne
     
    	RETURN ISNULL(@estColonneDansTable, 0)
    END
     
    -- Table qui contient la liste des colonnes à vérifier
    CREATE TABLE C
    (
    	nomColonne SYSNAME CONSTRAINT CHK_C_nomColonne CHECK (dbo.Fn_EstColonneDansTable(nomColonne) = 1)
    )
     
    -- Colonnes à vérifier
    INSERT INTO dbo.C VALUES ('nom')
    INSERT INTO dbo.C VALUES ('prenom')
    GO
     
    -- Le trigger
    ALTER TRIGGER TR_AU_B
    	ON dbo.B
    AFTER UPDATE
    AS
    BEGIN
    	DECLARE @SQL NVARCHAR(256),
    			@listeColonnesPasAVerifier NVARCHAR(256),
    			@listeColonnesAVerifier NVARCHAR(256)
     
    	;WITH
    		CTE_LISTE_COLONNES (colonne) AS -- Recherche la liste des colonnes qu'il fautdra peut-être mettre à jour
    		(
    				SELECT C.name
    				FROM sys.columns C
    				JOIN sys.tables T ON C.object_id = T.object_id
    				WHERE T.name = 'A'
    			EXCEPT
    					-- Liste des colonnes déterminantes d'une différence
    					SELECT nomColonne
    					FROM dbo.C
    			EXCEPT
    				SELECT 'ID'
    		)
    	-- Conservation de la liste des colonnes devant être mises à jour, séparées par dés virgules
    	SELECT @listeColonnesPasAVerifier = ISNULL(@listeColonnesPasAVerifier, '') + colonne + ' = B.' + colonne + ', '
    	FROM CTE_LISTE_COLONNES
     
    	-- Suppression de la virgule finale
    	SELECT @listeColonnesPasAVerifier = LEFT(@listeColonnesPasAVerifier, LEN(@listeColonnesPasAVerifier) - 1)
     
    	-- Si la liste des colonnes est valuée (<=> il y a des colonnes à mettre à jour)
    	IF @listeColonnesPasAVerifier IS NOT NULL
    	BEGIN
    		-- Recherche de la liste des colonnes à vérifier
    		SELECT @listeColonnesAVerifier = ISNULL(@listeColonnesAVerifier, '') + 'B.'  + nomColonne + ' <> A.' + nomColonne + ' AND '
    		FROM dbo.C
     
    		-- Suppression du AND final
    		SELECT @listeColonnesAVerifier = LEFT(@listeColonnesAVerifier, LEN(@listeColonnesAVerifier) - LEN(' AND '))
     
    		IF @listeColonnesAVerifier IS NOT NULL
    		BEGIN
    			SET @SQL = 'UPDATE maBD.dbo.A SET ' + @listeColonnesPasAVerifier +
    						' FROM maBD.dbo.B AS B JOIN maBD.dbo.A AS A ON A.ID = B.ID' + 
    						' WHERE ' + @listeColonnesAVerifier
    		END
     
    		-- PRINT @SQL
    		EXEC master.dbo.sp_executeSQL @SQL
    	END
    END
    GO
     
    -- Test
    UPDATE dbo.B
    SET Adresse = REPLACE(Adresse, 'Yaourt', 'Jambon')
    GO
     
    -- Vérification
    SELECT * FROM dbo.A
    SELECT * FROM dbo.B
    Mais il est clair que ce n'est pas très propre.
    Ne pouvez-vous pas écrire une fonction qui vous retourne la liste des colonnes qui doivent être vérifiées ? C'est aussi maintenable qu'une table contenant la liste des colonnes que vous devez vérifier.

    Dans tous les cas je ne vous conseille pas d'écrire cela dans un trigger, mais plutôt dans une procédure stockée ...

    @++

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2003
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Septembre 2003
    Messages : 401
    Par défaut
    j'suis pas vraiement au point sur les triggers et les procédures stockées donc j'ai pas recul pour savoir qu'elle solution est la mieux...

    En tout cas un grand merci pour ta réponse que je vais étudier avec un grand intérêt.

  4. #4
    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 : 43
    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
    Par défaut
    Bonjour,

    Un trigger est un cas particulier de procédure stockée.

    Un procédure stockée :

    - effectue au moins une transaction (SELECT | INSERT | UPDATE | DELETE)
    - n'est exécutée que sur demande
    - peut accepter des paramètres
    - peut retourner des valeurs ou un ensemble de données

    Un trigger :

    - est attaché à une table (et depuis SQL Server 2005 il peut être attaché à une base de données ou à une instance)
    - s'exécute lors de la survenance d'un évènement sur l'objet auquel il est attaché (pour une table : INSERT | UPDATE | DELETE)
    - n'accepte pas de paramètres
    - ne retourne rien

    Enfin retenez qu'un trigger et plus gourmand en ressources qu'une procédure stockée


    @++

Discussions similaires

  1. [AC-2003] SQL - Selection Nom Colonne dans paramétre.
    Par aminnio dans le forum VBA Access
    Réponses: 3
    Dernier message: 11/03/2013, 14h34
  2. TRIGGER : Nom de la colonne Modifié
    Par nooneelse dans le forum PL/SQL
    Réponses: 4
    Dernier message: 07/06/2008, 17h15
  3. requete SQL pour nom de colonne de mes tables..
    Par dutty76 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 17/03/2008, 11h06
  4. SQL - ORACLE : Extraction Nom Colonnes sur 1 seule ligne
    Par Mimile28 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/09/2007, 15h01
  5. Réponses: 4
    Dernier message: 19/05/2005, 14h18

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