2009-05-19 4 views
1

Mise à jour: Mon problème ne semble pas être avec le serveur SQL. J'ai exécuté manuellement une instruction de mise à jour dans la base de données par rapport à la vue et j'ai pu mettre à jour la table Barre. Je vais fermer cela et rechercher les OleDbDataAdapters plus car je pense que le problème réside avec eux.Comment déterminer quelle table d'une vue multitable peut être mise à jour?

Cette question s'applique à MS SQL Server 2000. Comment déterminer quelle table de la vue multitable peut être modifiée?

J'ai la vue suivante:

CREATE VIEW dbo.MyView 
AS 
SELECT  dbo.Foo.Id, dbo.Bar.Id, dbo.Foo.column1, dbo.Foo.column2, 
      dbo.Foo.column3, dbo.Bar.column1, dbo.Bar.column2, 
      dbo.Bar.column3 
FROM  dbo.Bar INNER JOIN 
        dbo.Foo ON dbo.Bar.Id = dbo.Foo.ForeignId 

Lorsque je mets à jour ce point de vue, (en utilisant OleDbDataAdapters VB.NET), je peux mettre à jour des colonnes de Foo, mais pas les colonnes de bar. Mon enquête sur ce sujet me dit que dans une vue multitable comme celle-ci, le serveur MS SQL vous permet seulement de mettre à jour une des tables. Donc ma question est, comment SQL Server détermine quelle table peut être mise à jour?

J'ai essayé un test dans lequel j'édite les champs d'une ligne particulière de la vue. Ensuite, j'ai utilisé OleDbDataAdapter pour mettre à jour la vue. Seules les modifications apportées à la table Foo ont été acceptées. Les modifications apportées à la table Bar ont été ignorées (aucune exception n'a été levée). Y at-il un moyen de prédire lequel des tableaux peut être mis à jour ou un moyen de contrôler lequel? Et si je voulais que Bar soit la table pouvant être mise à jour au lieu de Foo?

Mise à jour: Je trouve cela sur Google, MS SQL Server 2000 Unleased:

http://books.google.com/books?id=G2YqBS9CQ0AC&pg=RA1-PA713&lpg=RA1-PA713&dq=ms+sql+server+ "vue multitable de +" ++ mise à jour & source = bl & OTS = ZuQXIlEPbO & sig = JbgdDe5yU73aSkxh-SLDdtMYZDs & hl = fr & ei = b-0SSq-aHZOitgPB38zgDQ & sa = X & Oi = book_result & ct = résultat & resnum = 1 # PRA1-PA713, M1

(pour une raison quelconque l'URL que je suis en train de coller ne fonctionne pas avec ce site, sorr y que vous devez copier & coller)

qui dit:.

  • Une mise à jour par une vue multitable ne peut affecter plus de une table de base sous-jacente.
  • Une suppression ne peut pas être exécutée sur des vues multitable.

Mais, je ne vois pas encore de réponse à ma question.

Encore une fois, ma question est:

Comment puis-je déterminer quelle table de la vue multitable peut être modifié? Je réalise que je peux écrire deux instructions de mise à jour une pour chaque table. Ma préoccupation est différente. J'ai besoin de vérifier le code qui utilise des vues comme celle ci-dessus et fait des mises à jour sur les vues.J'espérais trouver un moyen de déterminer quelles parties des mises à jour seraient silencieusement ignorées.

Exemple:

je modifier Bar.Column1 puis appeler la méthode de mise à jour() du OleDbDataAdapter. Cela entraîne que la table Bar n'est pas modifiée et qu'aucune exception n'est levée. Si je modifie Foo.Column2, puis appelez Update() la table Foo est modifiée.

+0

Lorsque vous essayez de mettre à jour la barre, mettez-vous à jour simultanément Foo? – JeffO

+0

Parce que j'utilise le OleDbDataAdapter je ne suis pas sûr de la syntaxe SQL exacte qui est fournie à la base de données. L'adaptateur de données extrait les données directement de la vue, donc je supposais qu'il met à jour la vue et non les tables individuelles. Savez-vous comment je peux vérifier cela? –

+0

Je dois ajouter que je comprends que la mise à jour de la vue provoque la mise à jour des tables de base. Je réalise que la vue elle-même ne contient aucune donnée. Désolé si c'était confus dans ce que j'ai écrit! –

Répondre

-1

Vous devez être en mesure d'identifier de manière unique la ligne de la table en retournant la clé primaire. Essayez de renvoyer dbo.Bar.Id dans la vue, et vous devriez pouvoir modifier les colonnes dans le tableau Bar.

+0

Dans ma vue actuelle, j'inclue Bar.Id dans la sélection. Je vais mettre à jour la question pour correspondre. D'autres idées? –

1

Vous pouvez mettre à jour n'importe quelle table dans la vue, mais uniquement les champs qui se trouvent tous dans la même table dans cette instruction. Si vous devez mettre à jour des champs de deux tables dans une vue, vous devez écrire deux instructions de mise à jour.

Personnellement, je préfère ne pas mettre à jour ou supprimer des vues du tout. J'utilise les tables de base pour cela.

Il existe également des règles concernant la possibilité de mise à jour de la vue. Voir les livres en ligne. Rechercher ceci: views-SQL Server, modification des données

+0

Si je vous comprends bien, vous me demandez de mettre à jour chaque table de base au lieu de mettre à jour la vue. Autant que je sache, cela va à l'encontre du but de la vue, par exemple, le code client doit connaître la structure des tables de base. –

+0

Et, plus précisément. Je réalise que je peux mettre à jour les tables indépendamment de la vue. Au lieu de cela, je voulais savoir comment MS SQL Server détermine laquelle des deux tables je peux mettre à jour. Le comportement que je vois est que les changements à Bar sont ignorés, mais les changements à Foo sont sauvegardés. –

+0

Si vous venez de modifier un champ dans Bar et non dans un champ de Foo, est-ce qu'il économiserait? SQL Server ne sélectionne pas une seule table à mettre à jour. La mise à jour ne peut concerner qu'une seule table même si vous mettez à jour la vue. Oui, le code client doit connaître la structure des tables de base dans tous les cas, car vous ne pouvez pas mettre à jour les champs de deux tables en même temps, jamais. – HLGEM

Questions connexes