Domanda

Database enorme in mssql2005 con base di codice grande a seconda della struttura di questo database.

Ho circa 10 tabelle simili che contengono tutte il nome del file o il percorso completo del file. Il percorso completo dipende sempre dall'ID elemento, quindi non ha senso memorizzarlo nel database. Ottenere dati utili da queste tabelle va un po 'così:

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

Vorrei creare una vista singola di tutte queste tabelle in modo che il nuovo codice che utilizza questo disastro di dati non debba conoscere tutte le diverse tabelle multimediali. Vorrei anche usare questa vista per le istruzioni di inserimento e aggiornamento. Ovviamente il vecchio codice farebbe ancora affidamento sulle tabelle per essere aggiornate.

Dopo aver letto la pagina msdn sulla la creazione di visualizzazioni in mssql2005 Non credo che una visione con SCHEMABINDING sarebbe sufficiente.

Come potrei creare una vista così aggiornabile?

È questa la strada giusta da percorrere?

È stato utile?

Soluzione

È possibile modificare le viste partizionate, purché soddisfino determinate condizioni.

Queste condizioni includono avere una colonna di partizionamento come parte della chiave primaria su ogni tabella e avere una serie di vincoli di controllo non sovrapposti per la colonna di partizionamento.

Questo non sembra essere il tuo caso.

Nel tuo caso, puoi effettuare una delle seguenti operazioni:

  • Ricrea le tue tabelle come viste (con colonne calcolate) per far funzionare il tuo software legacy e fai riferimento a tutta la tabella dal nuovo software
  • Utilizzare i trigger INSTEAD OF per aggiornare le tabelle.

Altri suggerimenti

Scorri verso il basso sulla pagina che hai collegato e vedrai un paragrafo sulle visualizzazioni aggiornabili. Non è possibile aggiornare una vista basata sui sindacati, tra le altre limitazioni. La logica alla base di questo è probabilmente semplice, come dovrebbe decidere Sql Server su quale tabella / vista sorgente dovrebbe ricevere l'aggiornamento / inserire?

Se una vista si basa su più tabelle di base, l'istruzione UPDATE sulla vista potrebbe funzionare o meno a seconda dell'istruzione UPDATE. Se l'istruzione UPDATE influisce su più tabelle di base, il server SQL genera un errore. Considerando che, se UPDATE ha effetto solo su una tabella di base nella vista, UPDATE funzionerà (non sempre correttamente). Le istruzioni di inserimento ed eliminazione falliranno sempre.

I trigger INSTEAD OF vengono utilizzati per AGGIORNARE, INSERIRE e ELIMINARE correttamente da una vista basata su più tabelle di base. I seguenti collegamenti contengono esempi insieme a un video tutorial sullo stesso.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top