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 :

Clés primaires sur des tables externes, alternatives par procédures stockées ?


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut Clés primaires sur des tables externes, alternatives par procédures stockées ?
    Hello,

    Pour ne pas multiplier les données dans les différentes bases que je souhaiterais mettre en place pour les utilisateurs, j'ai une question en lien avec les FOREIGN KEY interbases.


    L'idée étant d'avoir une base avec une table Main qui contiendrait des valeurs uniques (exemple une liste de devises monétaires, ou de pays). Cette liste donnant lieu à de nombreux liens dans la base, mais aussi dans d'autres. Aussi, comme les données de la table seront amenées à évoluer, je me posait la question de la reproduction de ces données dans les autres bases du serveur/environnement (linkedserver).

    SQLPro a indiqué sur le net que

    Une relation n'est autre qu'une jointure entre deux table. C'est possible entre
    différentes bases et différents serveurs même hétérogènes (ex Oracle / SQL Server).
    Si tu veut parler d'intégrité référentielle, donc de contrainte FOREIGN KEY,
    non, cela n'est pas pris en charge :
    ***** DÉMO ******

    CREATE DATABASE _test
    GO
    CREATE DATABASE _test2
    GO
    Use _test
    GO
    CREATE TABLE TEST_in (COL1 INT NOT NULL PRIMARY KEY)
    GO
    Use _test2
    GO
    CREATE TABLE TEST_out (COL1 INT NOT NULL PRIMARY KEY,
    COL2 INT FOREIGN KEY
    REFERENCES _test..TEST_in (COL1))
    GO

    /*
    Serveur : Msg 1763, Niveau 16, État 1, Ligne 1
    Les références de clés étrangères aux bases de données croisées ne sont pas
    prises en charge. Clé étrangère '_test..TEST_in'.
    Serveur : Msg 1750, Niveau 16, État 1, Ligne 1
    Impossible de créer la contrainte. Voir les erreurs précédentes.
    */

    ****************

    En revanche tu peut faire cela par trigger. Mais pose toi la question de
    l'évolution des bases et des serveurs :
    si la base distante est mise sur un autre serveur et que ce dernier à besoin
    d'être arrêté pour des raisons de maintenance, alors ta base primale sera
    bloquée car en attente de validation des effets du curseur.
    Mieux vaut donc privilégié une procédure stockée qui gérera le cas d'absence de
    la base distante, ou la réplication (asynchrone).
    Je cherche donc à savoir quelle attitude adopter ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Je tente une piste avec les trigger.

    Je resitue mon contexte :
    - base_A, table_1 qui me sert de données communes (que je cherche donc à répliquer) (1 champ ID identity, 1 champ bidon de type varchar(10))
    - base_B, table_2 qui sera la réplication de base_A.table_1
    - base_B, vue_1 qui "voit" les données de base_A.table_1

    J'ai donc au niveau SQL
    View_1:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT base_A.dbo.Table_1.* 
    FROM base_A.dbo.Table_1

    J'ai mis en place un trigger de type INSTEAD OF (j'ai cru comprendre que le AFTER sur une vue n'est pas correct.
    Trigger:
    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
    USE [Base_B]
    GO
    /****** Object:  Trigger [dbo].[essai2]    Script Date: 07/09/2012 17:37:47 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		<Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:	<Description,,>
    -- =============================================
    ALTER TRIGGER [dbo].[essai2] 
       ON  [dbo].[View_1]
       INSTEAD OF UPDATE,INSERT
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	--SET NOCOUNT ON;
    DROP TABLE [Base_B].[dbo].[Table_2];
     
    SELECT * INTO [Base_B].[dbo].[Table_2] FROM [Base_B].[dbo].[View_1];
     
        -- Insert statements for trigger here
     
    END
    (je suis conscient des problème par la suite si je mets des clés primaires/étrangères dans Base_B, je cherche d'abord à bien déclencher le trigger)

    Mon soucis est lorsque je fais une insertion dans Base_A, je n'ai pas de déclanchement, ou alors les données ne sont pas mises à jour dans ma Table.

    Quelle est mon erreur de trigger ici svp ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    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
    Par défaut
    Citation Envoyé par jpcheck Voir le message
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT base_A.dbo.Table_1.* 
    FROM base_A.dbo.Table_1

    J'ai mis en place un trigger de type INSTEAD OF (j'ai cru comprendre que le AFTER sur une vue n'est pas correct.
    Trigger:
    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
    USE [Base_B]
    GO
    /****** Object:  Trigger [dbo].[essai2]    Script Date: 07/09/2012 17:37:47 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		<Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:	<Description,,>
    -- =============================================
    ALTER TRIGGER [dbo].[essai2] 
       ON  [dbo].[View_1]
       INSTEAD OF UPDATE,INSERT
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	--SET NOCOUNT ON;
    DROP TABLE [Base_B].[dbo].[Table_2];
     
    SELECT * INTO [Base_B].[dbo].[Table_2] FROM [Base_B].[dbo].[View_1];
     
        -- Insert statements for trigger here
     
    END
    (je suis conscient des problème par la suite si je mets des clés primaires/étrangères dans Base_B, je cherche d'abord à bien déclencher le trigger)

    Mon soucis est lorsque je fais une insertion dans Base_A, je n'ai pas de déclanchement, ou alors les données ne sont pas mises à jour dans ma Table.

    Quelle est mon erreur de trigger ici svp ?
    USE [Base_B]

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    dois-je le supprimer ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    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
    Par défaut
    Citation Envoyé par jpcheck Voir le message
    Salut,

    dois-je le supprimer ?
    Il m'a semblé que ce trigger devait opérer sur la table de la base A.
    Et la vous le créez sur la table de la base B.

  6. #6
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Le trigger se déclenche sur la vue de la base_B, qui est sensée être UPDATEd lors d'un changement de la table dans la base_A.

    Mais je fais peut-être fausse route.
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/05/2015, 21h00
  2. Réponses: 4
    Dernier message: 13/08/2014, 13h00
  3. Réponses: 7
    Dernier message: 05/09/2010, 09h34
  4. modéliser une table mapping ayant des clés étrangères sur des vues
    Par touftouf57 dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 19/06/2010, 02h04
  5. Réponses: 2
    Dernier message: 07/05/2008, 08h51

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