github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/migration/v2_to_v3/menage/delete_old.sql (about)

     1  -- Ce script supprime les camps anciens ainsi que toutes les personnes
     2  -- liées. Plus précisément on conserve :
     3  --  - les membres de l'asso
     4  --  - les donateurs
     5  --  - les séjours 2018 et plus
     6  --  - les participants/equipiers/responsables liés à de ces séjours
     7  BEGIN;
     8  
     9  CREATE FUNCTION too_old(date timestamp) RETURNS bool AS 'SELECT extract(year from date) < 2018;' LANGUAGE SQL;
    10  
    11  CREATE TABLE keep_personnes (id_personne int REFERENCES personnes);
    12  
    13  INSERT INTO
    14      keep_personnes (id_personne)
    15  SELECT
    16      DISTINCT id
    17  FROM
    18      (
    19          SELECT
    20              personnes.id
    21          FROM
    22              personnes
    23              JOIN factures f ON personnes.id = f.id_personne
    24              JOIN participants p ON f.id = p.id_facture
    25              JOIN camps c ON p.id_camp = c.id
    26          WHERE
    27              NOT too_old(c.date_debut)
    28          UNION
    29          SELECT
    30              personnes.id
    31          FROM
    32              personnes
    33              JOIN participants p ON p.id_personne = personnes.id
    34              JOIN camps c ON p.id_camp = c.id
    35          WHERE
    36              NOT too_old(c.date_debut)
    37          UNION
    38          SELECT
    39              personnes.id
    40          FROM
    41              personnes
    42              JOIN participantsimples p ON p.id_personne = personnes.id
    43              JOIN camps c ON p.id_camp = c.id
    44          WHERE
    45              NOT too_old(c.date_debut)
    46          UNION
    47          SELECT
    48              personnes.id
    49          FROM
    50              personnes
    51              JOIN equipiers p ON p.id_personne = personnes.id
    52              JOIN camps c ON p.id_camp = c.id
    53          WHERE
    54              NOT too_old(c.date_debut)
    55          UNION
    56          SELECT
    57              personnes.id
    58          FROM
    59              personnes
    60          WHERE
    61              personnes.rang_membre_asso <> ''
    62          UNION
    63          SELECT
    64              dons.id_personne
    65          FROM
    66              dons
    67          WHERE
    68              dons.id_personne IS NOT NULL
    69      ) AS pfpgcippgci;
    70  
    71  DELETE FROM
    72      paiements
    73  WHERE
    74      id = ANY (
    75          SELECT
    76              paiements.id
    77          FROM
    78              paiements
    79              JOIN factures f ON paiements.id_facture = f.id
    80              JOIN participants p ON f.id = p.id_facture
    81              JOIN camps c ON p.id_camp = c.id
    82          WHERE
    83              too_old(c.date_debut)
    84      );
    85  
    86  DELETE FROM
    87      paiements
    88  WHERE
    89      id_facture = ANY (
    90          SELECT
    91              factures.id
    92          FROM
    93              factures
    94          WHERE
    95              id_personne NOT IN (
    96                  SELECT
    97                      keep_personnes.id_personne
    98                  FROM
    99                      keep_personnes
   100              )
   101      );
   102  
   103  DELETE FROM
   104      factures
   105  WHERE
   106      id = ANY (
   107          SELECT
   108              factures.id
   109          FROM
   110              factures
   111              JOIN participants p ON factures.id = p.id_facture
   112              JOIN camps c ON p.id_camp = c.id
   113          WHERE
   114              too_old(c.date_debut)
   115      );
   116  
   117  DELETE FROM
   118      factures
   119  WHERE
   120      id_personne NOT IN (
   121          SELECT
   122              keep_personnes.id_personne
   123          FROM
   124              keep_personnes
   125      );
   126  
   127  DELETE FROM
   128      documents
   129  WHERE
   130      id = ANY (
   131          SELECT
   132              document_aides.id_document
   133          FROM
   134              document_aides
   135              JOIN aides a ON document_aides.id_aide = a.id
   136              JOIN participants p ON a.id_participant = p.id
   137              JOIN camps c ON p.id_camp = c.id
   138          WHERE
   139              too_old(c.date_debut)
   140      );
   141  
   142  DELETE FROM
   143      aides
   144  WHERE
   145      id = ANY (
   146          SELECT
   147              aides.id
   148          FROM
   149              aides
   150              JOIN participants p ON aides.id_participant = p.id
   151              JOIN camps c ON p.id_camp = c.id
   152          WHERE
   153              too_old(c.date_debut)
   154      );
   155  
   156  DELETE FROM
   157      messages
   158  WHERE
   159      id = ANY (
   160          SELECT
   161              message_placeliberes.id_message
   162          FROM
   163              message_placeliberes
   164              JOIN participants p ON message_placeliberes.id_participant = p.id
   165              JOIN camps c ON p.id_camp = c.id
   166          WHERE
   167              too_old(c.date_debut)
   168      );
   169  
   170  DELETE FROM
   171      participants
   172  WHERE
   173      id = ANY (
   174          SELECT
   175              participants.id
   176          FROM
   177              participants
   178              JOIN camps c ON participants.id_camp = c.id
   179          WHERE
   180              too_old(c.date_debut)
   181      );
   182  
   183  DELETE FROM
   184      participantsimples
   185  WHERE
   186      id = ANY (
   187          SELECT
   188              participantsimples.id
   189          FROM
   190              participantsimples
   191              JOIN camps c ON participantsimples.id_camp = c.id
   192          WHERE
   193              too_old(c.date_debut)
   194      );
   195  
   196  DELETE FROM
   197      equipiers
   198  WHERE
   199      id = ANY (
   200          SELECT
   201              equipiers.id
   202          FROM
   203              equipiers
   204              JOIN camps c ON equipiers.id_camp = c.id
   205          WHERE
   206              too_old(c.date_debut)
   207      );
   208  
   209  DELETE FROM
   210      documents
   211  WHERE
   212      id = ANY (
   213          SELECT
   214              document_camps.id_document
   215          FROM
   216              document_camps
   217              JOIN camps c ON document_camps.id_camp = c.id
   218          WHERE
   219              too_old(c.date_debut)
   220      );
   221  
   222  DELETE FROM
   223      messages
   224  WHERE
   225      id = ANY (
   226          SELECT
   227              message_documents.id_message
   228          FROM
   229              message_documents
   230              JOIN camps c ON message_documents.id_camp = c.id
   231          WHERE
   232              too_old(c.date_debut)
   233      );
   234  
   235  DELETE FROM
   236      messages
   237  WHERE
   238      id = ANY (
   239          SELECT
   240              message_sondages.id_message
   241          FROM
   242              message_sondages
   243              JOIN camps c ON message_sondages.id_camp = c.id
   244          WHERE
   245              too_old(c.date_debut)
   246      );
   247  
   248  DELETE FROM
   249      camps
   250  WHERE
   251      too_old(camps.date_debut);
   252  
   253  DELETE FROM
   254      documents
   255  WHERE
   256      id = ANY (
   257          SELECT
   258              id_document
   259          FROM
   260              document_personnes
   261          WHERE
   262              id_personne NOT IN (
   263                  SELECT
   264                      id_personne
   265                  FROM
   266                      keep_personnes
   267              )
   268      );
   269  
   270  DELETE FROM
   271      personnes
   272  WHERE
   273      id NOT IN (
   274          SELECT
   275              id_personne
   276          FROM
   277              keep_personnes
   278      );
   279  
   280  -- cleanup
   281  SELECT
   282      count(*)
   283  FROM
   284      personnes;
   285  
   286  DROP TABLE keep_personnes;
   287  
   288  DROP FUNCTION too_old (date timestamp);
   289  
   290  COMMIT;