2009-03-16 9 views
0

Base de données énorme dans mssql2005 avec une grande base de code en fonction de la structure de cette base de données.Vue modifiable dans mssql avec plusieurs tables et valeurs calculées

J'ai environ 10 tables similaires, ils contiennent tous le nom de fichier ou le chemin d'accès complet au fichier. Le chemin d'accès complet dépend toujours de l'identifiant de l'élément, cela n'a donc aucun sens de le stocker dans la base de données. Obtenir des données utiles sur ces tables va un peu comme ceci:

SELECT a.item_id 
, a.filename 
FROM (
    SELECT id_item AS item_id 
    , path AS filename 
    FROM xMedia 

    UNION ALL 

    -- media_path has a different collation 
    SELECT item_id AS item_id 
    , (media_path COLLATE SQL_Latin1_General_CP1_CI_AS) AS filename 
    FROM yMedia 

    UNION ALL 

    -- fullPath contains more than just the filename 
    SELECT itemId AS item_id 
    , RIGHT(fullPath, CHARINDEX('/', REVERSE(fullPath))-1) AS filename 
    FROM zMedia 

    -- real database has over 10 of these tables 
) a 

Je voudrais créer une vue unique de toutes ces tables afin que le nouveau code à l'aide de ces données-catastrophe n'a pas besoin de connaître tous les différentes tables de médias. J'aimerais aussi utiliser cette vue pour les instructions d'insertion et de mise à jour. Évidemment, l'ancien code reposerait toujours sur les tables pour être à jour. Après la lecture de la page msdn à propos de creating views in mssql2005 je ne pense pas qu'une vue avec SCHEMABINDING serait suffisante.

Comment créer une telle vue pouvant être mise à jour?

Est-ce la bonne solution?

Répondre

1

Vous pouvez modifier les vues partitionnées, à condition qu'elles répondent à certaines conditions.

Ces conditions comprennent ayant une partitioning column comme une partie de la clé primaire de chaque table, et ayant un ensemble de contraintes de vérification ne se chevauchant pas pour la colonne de séparation.

Cela ne semble pas être votre cas.

Dans votre cas, vous pouvez le faire ou l'autre des suivantes:

  • Recréer vous tables de vues (avec des colonnes calculées) pour votre héritage doux au travail, et se référer à l'ensemble du tableau de la nouvelle
  • douce
  • Utilisez les déclencheurs INSTEAD OF pour mettre à jour les tables.
2

Faites défiler vers le bas sur la page que vous avez liée et vous verrez un paragraphe sur les vues pouvant être mises à jour. Vous ne pouvez pas mettre à jour une vue basée sur les unions, entre autres limitations. La logique sous-jacente est probablement simple, comment Sql Server devrait-il décider de quelle table/vue source devrait recevoir la mise à jour/insertion?

+1

Vous pouvez réellement mettre à jour des vues sur la base de l'Union à condition qu'ils contiennent une colonne paritioning qui identifiera la table que vous mettez à jour. – Quassnoi

1

Si une vue est basée sur plusieurs tables de base, l'instruction UPDATE sur la vue peut fonctionner ou non en fonction de l'instruction UPDATE. Si l'instruction UPDATE affecte plusieurs tables de base, SQL Server renvoie une erreur. Considérant que, si la mise à jour affecte seulement une table de base dans la vue alors le UPDATE fonctionnera (pas toujours toujours). Les instructions d'insertion et de suppression échoueront toujours. Au lieu des déclencheurs, sont correctement utilisés pour METTRE à JOUR, INSÉRER et SUPPRIMER à partir d'une vue basée sur plusieurs tables de base. Les liens suivants ont des exemples avec un didacticiel vidéo sur le même.

INSTEAD OF INSERT Trigger
INSTEAD OF UPDATE Trigger
INSTEAD OF DELETE Trigger

Questions connexes