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

MS SQL Server Discussion :

[ON DELETE] vues, tables, trigger AFTER DELETE


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Etudiant (domaine de prédilection java)
    Inscrit en
    Mars 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant (domaine de prédilection java)
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2012
    Messages : 71
    Points : 62
    Points
    62
    Par défaut [ON DELETE] vues, tables, trigger AFTER DELETE
    Bonjour tout le monde,
    Je crée cette discussion car il me reste des points d'ombre en ce qui concerne la suppression des enregistrements, malgré les articles http://blog.developpez.com/sqlpro/p8...plexes-dans-l/, http://sqlpro.developpez.com/SGBDR/ReglesCodd/
    et les discussions http://www.developpez.net/forums/d11...choisir/...etc, que j'ai parcourus.
    Mes questions sont les suivantes:
    1.En cas d'utilisation de vues(ce que j'ai adopté), et d'utilisation de clauses ON DELETE SET DEFAULT
    A-Si la clé primaire de la table "Mère" est autoincrémentée, dès lors il sera pas possible d'insérer un tuple 0, '<client bidon>' comme dans l'exemple http://blog.developpez.com/sqlpro/p8...plexes-dans-l/, si??
    B- Par conséquent ce sera pas non plus possible de créer la clé étrangère avec la valeur par défaut '0' à cause de la contrainte d'intégrité réferentielle??

    2-En cas de suppression avec la clause ON SET DEFAULT comment fait-on pour reporter la suppression physique aux heures creuses??. J'avais pensé aux triggers AFTER DELETE, mais apparemment c'est pas la solution, vu qu'il verrouille toutes les tables impactées.
    3. J'ai les pseudo-tables suivantes:
    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
    /* -----------------------------------------------------------------------------
          TABLE : PROCESS
    ----------------------------------------------------------------------------- */
     
    create table PROCESS
      (
         ID_PROC int  IDENTITY(1,1) NOT NULL  ,
         NOM_PROC varchar(50)  null  
         ,
         constraint PK_PROCESS primary key (ID_PROC)
      ) 
    go
    /* -----------------------------------------------------------------------------
          TABLE : SITE
    ----------------------------------------------------------------------------- */
     
    create table SITE
      (
         ID_SITE int  IDENTITY(1,1) NOT NULL  ,
         NOM_SITE varchar(50)  null  
     
         ,
         constraint PK_SITE primary key (ID_SITE)
      ) 
    go
     
    /* -----------------------------------------------------------------------------
          TABLE : SITE_PROCESS
    ----------------------------------------------------------------------------- */
     
    create table SITE_PROCESS
      (
         ID_PROC int  not null  ,
         ID_SITE int  not null  
         ,
         constraint PK_SITE_PROCESS primary key (ID_PROC, ID_SITE)
      ) 
    go
     
    create table AFFAIRE_TYPE
      (
         ID_AFFTYPE int IDENTITY(1,1) NOT NULL  ,
         ID_PROC int  not null  ,
         ID_SITE int  not null  ,
         NOM_BIDON varchar(50) null
         ,
         constraint PK_AFFAIRE_TYPE primary key (ID_AFFTYPE)
      ) 
    go
     
    create table AFFAIRES
      (
         ID_AFFAIRES int  IDENTITY(1,1) NOT NULL  ,
         ID_AFFTYPE int  not null  ,
         PROCESS_D varchar(64)  null 
         ,
         constraint PK_AFFAIRES primary key ( ID_AFFAIRES)
      ) 
     
    /* -----------------------------------------------------------------------------
          REFERENCES SUR LES TABLES
    ----------------------------------------------------------------------------- */
     
    alter table SITE_PROCESS 
         add constraint FK_SITE_PROCESS_SITE foreign key (ID_SITE) 
                   references SITE (ID_SITE)
    go
     
     
    alter table SITE_PROCESS 
         add constraint FK_SITE_PROCESS_PROCESS foreign key (ID_PROC) 
                   references PROCESS (ID_PROC)
    go
     
    alter table AFFAIRE_TYPE 
         add constraint FK_AFFAIRE_TYPE_SITE_PROCESS foreign key (ID_PROC, ID_SITE) 
                   references SITE_PROCESS (ID_PROC, ID_SITE)
    go
    alter table AFFAIRES 
         add constraint FK_AFFAIRES_AFFAIRE_TYPE foreign key (ID_AFFTYPE) 
                   references AFFAIRE_TYPE (ID_AFFTYPE)
    go
    et son jeu de test correspondant...
    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
    INSERT INTO SITE
               (NOM_SITE)
         VALUES
               ('lundinistan')
    GO
    INSERT INTO SITE
               (NOM_SITE)
         VALUES
               ('mardinistan')
    GO
    INSERT INTO PROCESS
               (NOM_PROC)
         VALUES
               ('bidon 1')
    GO
    INSERT INTO PROCESS
               (NOM_PROC)
         VALUES
               ('bidon 2')
    GO
    INSERT INTO SITE_PROCESS
               (ID_PROC
               ,ID_SITE)
         VALUES
               (1
               ,1)
    GO
     
    INSERT INTO SITE_PROCESS
               (ID_PROC
               ,ID_SITE)
         VALUES
               (2
               ,1)
    GO
    INSERT INTO AFFAIRE_TYPE
               (
               ID_PROC
               ,ID_SITE
               ,NOM_BIDON)
         VALUES
               (
               2
               ,1
               ,'BIDON1')
    GO
    INSERT INTO AFFAIRE_TYPE
               (
               ID_PROC
               ,ID_SITE
               ,NOM_BIDON)
         VALUES
               (
               1
               ,1
               ,'BIDON2')
    GO
    INSERT INTO AFFAIRES
               (
               ID_AFFTYPE
               ,PROCESS_D)
         VALUES
               (
               1
               ,'one_type')
    GO
     
    INSERT INTO AFFAIRES
               (
               ID_AFFTYPE
               ,PROCESS_D)
         VALUES
               (
               2
               ,'other_type')
    GO
    Pourrais-je avoir un exemple de suppression d'un site(table SITE) avec ON DELETE SET DEFAULT ???
    Je vous remercie

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 865
    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 865
    Points : 53 018
    Points
    53 018
    Billets dans le blog
    6
    Par défaut
    1 - A) on peut toujours forcer une valeur dans l'incrément; A lire : http://blog.developpez.com/sqlpro/p6...ec-sql-server/ (notamment § 3
    1 - B) résolu par ce que résolue pour 1 - A.

    2 - On utilise un job planifié la nuit ou les weekends qui delete tranquillement par paquet les lignes avec FK à zéro ou NULL. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WHILE EXISTS(SELECT * 
                 FROM   T_FACTURE_FCT
                 WHERE  CLI_ID = 0)
    DELETE TOP 5000 
    FROM   T_FACTURE_FCT
    WHERE  CLI_ID = 0;
    Pour le 3, désolé, j'ai plus le temps !!!!

    A +

  3. #3
    Membre du Club
    Homme Profil pro
    Etudiant (domaine de prédilection java)
    Inscrit en
    Mars 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant (domaine de prédilection java)
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2012
    Messages : 71
    Points : 62
    Points
    62
    Par défaut
    Pour le 3, désolé, j'ai plus le temps !!!!

    A +
    Pas de soucis, merci pour le lien, j'attendrai que vous ayez plus de temps.
    Finalement, je constate(sauf mauvaise interprétation de ma part) que l'utilisation du ON DELETE CASCADE n'est pas si dramatique,mis à part le temps processeur et les incommodités dues au verrouillage de toutes les tables impactées, et qu'en fait un DELETE SET NULL associé à un trigger after ou un batch de nuit effectue le même job. c'est exact???

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    En effet la finalité est la même, mais l'un est fait aux heures pleines pendant l'activité alors que l'autre est déportée à un moment où il ne se passe rien.

    Sur une application avec ne serait-ce que cinquante utilisateurs en simultanés, les verrous doivent être levés le plus rapidement possible.

  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 865
    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 865
    Points : 53 018
    Points
    53 018
    Billets dans le blog
    6
    Par défaut
    Il y a une grosse différence entre mettre à jour une colonne et supprimer des lignes. Dans le cas de la mise à jour d'une colonne, seul la table + les index contenant cette colonne sont impactées. De plus si cela concerne une seule ligne alors l'impact est minimal.
    En revanche, la suppression de lignes impacte tous les index et si elle est massive, soit de nombreuses lignes, pas voir la table entière !

    A +

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Ou alors il y a solution qui ne cause pas même la mise à jour d'une colonne : http://blog.developpez.com/mssql-san...-fk/#more11039.

    Vous pouvez aussi ne rien supprimer "en live" mais utiliser un marqueur de suppression pour faire la suppression effective en batch aux heures creuses..

Discussions similaires

  1. [MySQL-5.1] Unknown Table OLD - Trigger AFTER DELETE
    Par poissonjone77 dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 28/06/2013, 11h59
  2. Problème Update dans un trigger After Delete
    Par gouzou38 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 16/05/2011, 15h52
  3. Trigger After Update avec la table Deleted vide ?
    Par azur668 dans le forum Développement
    Réponses: 4
    Dernier message: 24/06/2009, 23h41
  4. Trigger after delete
    Par festayre47 dans le forum PL/SQL
    Réponses: 8
    Dernier message: 27/12/2007, 12h02
  5. [8i] Trigger before ou after delete
    Par Débéa dans le forum Oracle
    Réponses: 3
    Dernier message: 15/02/2006, 13h49

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