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 :

[SQL2008][TSQL] Contrainte par un trigger ?


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Par défaut [SQL2008][TSQL] Contrainte par un trigger ?
    Bonjour,

    J'aimerais votre conseil concernant ce petit problème :

    J'ai, par exemple 3 tables :

    FAL qui est le lieu
    TEMPLATE pour lister mes taches
    TASK pour archiver mes taches
    --
    TEMPLATE a deux clés étrangère sur FAL
    TASK à une clé étrangère sur FAL
    --

    La condition est la suivante :

    Lors de la suppression d'un enregistrement dans FAL, je regarde si DANS ma première clé de TEMPLATE il existe des champs,
    si il en existe pas
    alors je fais un delete cascade DANS TEMPLATE ET TASK
    sinon un rollback.

    Est ce possible qu'en faisant un NO ACTION sur ma première clé, un cascade sur ma deuxième clé dans template et un cascade dans TASK j'arrive naturellement à respecter ma condition ?

    Si non, je pense 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
    CREATE TRIGGER dbo.TR_DELETE_FAL_VERIF_TEMPLATE 
       ON  dbo.FAL 
       FOR DELETE
    AS
     
    -- vérification dans template si il existe la clé dans les XXXX_ID (ne pas confondre avec les XXX_info_ID)
    IF EXISTS (SELECT COUNT(*)
                FROM TEMPLATE WHERE FAL_ID=(select deleted.FAL_ID from DELETED))
         BEGIN
    		ROLLBACK
    		RAISERROR ('blablabla', 16, 1) 
    	END
    GO
    Si le trigger est la solution, le code serait - il bon ?


    Merci d'avance 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 : 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,

    N'étant pas un très grand fan du style de cas que vous évoquez à l'aide de la clause CASCADE, j'aurai écrit :

    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
    CREATE TRIGGER dbo.TR_DELETE_FAL_VERIF_TEMPLATE 
       ON  dbo.FAL 
       FOR DELETE
    AS
    BEGIN
    	-- vérification dans template si il existe la clé 
    	-- dans les XXXX_ID (ne pas confondre avec les XXX_info_ID)
    	IF EXISTS 
    	(
    		SELECT		*
    		FROM		dbo.TEMPLATE AS T
    		INNER JOIN	deleted AS D
    					ON D.FAL_ID = T.FAL_ID
    	)
    	BEGIN
    		ROLLBACK TRANSACTION
     
    		RAISERROR ('blablabla', 16, 1)
     
    		RETURN
    	END
    	ELSE
    	BEGIN
    		DELETE		FROM dbo.TEMPLATE
    		FROM		dbo.TEMPLATE AS T
    		INNER JOIN	deleted AS D
    					ON D.FAL_ID = T.FAL_ID
     
    		DELETE		FROM dbo.TASK
    		FROM		dbo.TASK AS T
    		INNER JOIN	deleted AS D
    					ON D.FAL_ID = T.FAL_ID	
    	END
    END
    GO
    @++

  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 994
    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 994
    Billets dans le blog
    6
    Par défaut
    Inutile de prévoir un trigger, vous pouvez mettre une FK avec DELETE CASCADE d'un côté et NO ACTION de l'autre.

    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 éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Par défaut
    Si j'ai bien compris :


    T_TEMPLATE
    FAL_ID -> NO ACTION
    FAL_INFO_ID -> CASCADE

    T_FAL
    FAL_ID

    Si je supprime un FAL_ID dans T_FAL
    alors s'il existe des FAL_INFO_ID dans template ca va faire un rollback sinon ca va supprimer toutes les lignes existantes dans template ?

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 994
    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 994
    Billets dans le blog
    6
    Par défaut
    Oui !

    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/ * * * * *

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

Discussions similaires

  1. Power AMC definir le nom des contraintes par defaut
    Par AAAWBBBWCCC dans le forum PowerAMC
    Réponses: 14
    Dernier message: 09/01/2014, 10h15
  2. [SQL2008][TSQL] Clause WHERE NOT IN dans un trigger
    Par greg360 dans le forum Développement
    Réponses: 4
    Dernier message: 19/11/2010, 18h19
  3. [TSQL]pb condition sur trigger
    Par bingo00 dans le forum Adaptive Server Enterprise
    Réponses: 2
    Dernier message: 09/10/2007, 11h29
  4. Réponses: 4
    Dernier message: 13/09/2007, 18h00
  5. Réponses: 4
    Dernier message: 23/06/2005, 12h44

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