La creazione del modello fisico dei dati

ALTER TABLE OrderItem ADD CONSTRAINT FK__OrderItem_SalesOrder FOREIGN KEY (SalesOrderID) RIFERIMENTI SalesOrder (SalesOrderID) ON DELETE CASCADE
  

Perché è questa affermazione chiamato un vincolo di integrità referenziale dichiarativa? Perché dichiara il comportamento della tabella integrità referenziale, come parte della definizione della tabella stessa, invece di porre in tale comportamento come un foglio di codice eseguibile computer. Ora rompere questo vincolo DRI e guardare a ciò ogni frase significa, a partire dai seguenti :

ALTER TABLE OrderItem ADD CONSTRAINT FK__OrderItem_SalesOrder

La frase precedente modifica la definizione della tabella OrderItem bambino per aggiungere il vincolo oggetto denominato FK__OrderItem_SalesOrder. Questo oggetto contiene i rimanenti tre righe di codice, che compongono le istruzioni effettiva del vincolo, come segue:

FOREIGN KEY (SalesOrderID) RIFERIMENTI SalesOrder (SalesOrderID)

Questa frase è la carne "e patate" del vincolo DRI. Crea la restrizione tra le OrderItem.SalesOrderID chiave esterna e le SalesOrder chiave primaria. SalesOrderID in modo che, per ogni valore memorizzato in OrderItem.SalesOrderID, un valore pari devono essere conservati in SalesOrder.SalesOrderID con cui OrderItem.SalesOrderID possono eguagliare. Se qualsiasi altro valore viene tentata in OrderItem.SalesOrderID, il database genera un errore e il tentativo fallisce. Infine, l'ultima riga del vincolo di DRI è la seguente:

ON DELETE CASCADE

Questa linea indica il database di eliminare prima tutte le righe OrderItem connessi a una riga SalesOrder che sta per essere eliminato. Senza la clausola ON DELETE CASCADE in questo vincolo DRI, nel tentativo di eliminare una riga SalesOrder con i relativi file OrderItem avrebbe gettato un errore, e non sarebbero state le modifiche al contenuto o tabella. Le prime quattro righe di codice vincolo sono sintassi DRI standard supportato da piattaforme di database più. Alcune piattaforme di database, come SQL Server 2000 e Oracle 9i, sostenere l'estensione ON DELETE CASCADE DRI per la sintassi di base per agevolare queste eliminazioni a catena. Per le piattaforme di database che non supportano le eliminazioni a catena in vincoli DRI, l'eliminazione a cascata comportamento deve essere attuato mediante un foglio di codice che viene eseguito automaticamente ogni volta che un utente tenta di eliminare una riga SalesOrder. Un tale pezzo di esecuzione automatica di codice viene chiamato un trigger. Anche se abbiamo accuratamente discutere trigger più tardi, abbiamo necessità di coprire le basi di quello che sono e come funzionano qui in modo che si può essere in contrasto e comparare i vincoli DRI. Prima di tutto, perché sono chiamati trigger? La risposta è che l'esecuzione di uno è "innescato" da un evento database (INSERT, UPDATE o DELETE). Un trigger è collegata a una tabella specifica ed è incaricato di eseguire automaticamente ogni volta che uno o più eventi database specifico svolgerà su tale tabella. È possibile inserire quasi tutto il codice SQL che si desidera in un trigger, incluso il codice che modifica il contenuto degli altri tabelle. Prendiamo, ad esempio, la seguente clausola:

ON DELETE CASCADE

Se attuata come un limite, il clausola precedente diventa il seguente codice:

TD_SalesOrder CREATE TRIGGER ON SalesOrder PER DELETE AS BEGIN DECLARE @ selezionare le righe int righe = @ @ @ ROWCOUNT IF @ Rows = 0 RETURN DELETE OrderItem da CH OrderItem, cancellati se ch.SalesOrderID = deleted.SalesOrderID END

Ora, per abbattere quello che sta succedendo in questo codice. In primo luogo, si aprono con l'intestazione grilletto. Questa intestazione sia crea il grilletto e lo collega a una tabella specifica e precisa anche l'evento o gli eventi che gli incendi che, come segue:

TD_SalesOrder CREATE TRIGGER ON SalesOrder PER DELETE AS

In altre parole, si sta creando un trigger sulla tabella SalesOrder denominata tD_SalesOrder, e si sta incaricando di svolgere ogni volta che si verifica un evento CANC sul tavolo SalesOrder. So far, so good. Ora guarda il corpo del trigger, la parte che esegue in realtà-come segue:

BEGIN DECLARE @ selezionare le righe int righe = @ @ @ ROWCOUNT IF @ Rows = 0 RETURN

Si avvia il blocco di codice con BEGIN e poi subito a dichiarare una variabile locale di tipo Integer denominato @ righe. Questa variabile contiene il numero di righe della tabella SalesOrder colpiti dall'evento DELETE. La variabile globale @ @ ROWCOUNT è controllata dal server di database, che contiene sempre il numero di righe coinvolte nella tabella più recente modificato dal codice attualmente in esecuzione, che in questo caso è la tabella SalesOrder. Quindi selezionate File = @ @ @ luoghi ROWCOUNT il numero di righe eliminate dalla tabella SalesOrder nella variabile locale che hai appena dichiarato. Se il numero di righe interessate è pari a zero, il codice di attivazione uscite grazia mediante l'istruzione RETURN, e non succede nulla più. Se questo test RETURN non esiste nel codice del trigger, il resto del codice del trigger viene eseguito, e non si desidera che ciò accada, perché tu saresti l'esecuzione del codice che dovrebbe essere eseguito solo se vi sono connessi righe figlio. Now per la parte del trigger che esegue effettivamente l'eliminazione a cascata, come segue:

DELETE OrderItem da CH OrderItem, cancellati se ch.SalesOrderID = deleted.SalesOrderID END

Questo relazionale eliminare elimina quelle righe della tabella OrderItem che sono relativi a tutte le righe del soppresso pseudotable-in sostanza, tutte le righe OrderItem relativi alle righe SalesOrder soppresso. Infine, si chiude il corpo del trigger utilizzando END. Trigger sono molto diverse capacità sulle diverse piattaforme di database. Il trigger che abbiamo appena discusso, ad esempio, che funziona sulla piattaforma SQL Server 2000, che definisce un evento a livello di istruzione, il che significa che questo trigger incendi una volta per ogni istruzione DELETE eseguita sul tavolo, non importa quante righe sono interessati da tale dichiarazione. In confronto, Oracle trigger può operare sia al livello di istruzione, come in SQL Server, oppure a livello di riga, in modo che il codice del trigger viene eseguito una volta per ogni singola riga che è influenzata dalla dichiarazione. Un'altra distinzione tra le piattaforme di database è quando si può sparare trigger. SQL Server incendi attiva dopo ha luogo la manifestazione e tutti i valori vengono modificati dalla dichiarazione (ma prima si sono impegnati a disco); Oracle consente di definire un trigger per eseguire prima o dopo l'evento si svolge. Esistono anche altre distinzioni. Così, quando è possibile realizzare l'integrità referenziale utilizzando vincoli DRI e quando si utilizzano i trigger? Beh, un vincolo di DRI è quasi sempre più veloce per eseguire l'operazione di equivalente attuata in un trigger, e certamente sono più semplici di codice, ma si devono talvolta logica più complessa di essere coinvolti, e per questo, è necessario utilizzare i trigger.

Molte volte si desidera fornire automaticamente i valori di default per le righe inserite in una tabella, per esempio, la data e l'ora di una vendita, o un valore di stato che rappresenta circa il punto di inizio di un processo di business. Questo comportamento viene implementato tramite impostazioni predefinite di default sono definite in specifiche colonne della tabella, e dire al vostro database, "Se questa colonna non è incluso nel INSERT per questa tabella, andare avanti e inserire automaticamente il valore di default. Se l'istruzione INSERT include questa colonna, utilizzare qualsiasi valore è stato fornito per questo. "Ecco come una dichiarazione di default appare nella definizione della tabella:

CREATE TABLE SalesOrder (SalesOrderID int IDENTITY (1,1), varchar CustomerNumber (12) NULL, SaleDate datetime DEFAULT GetDate () NOT NULL,  CONSTRAINT PK_SalesOrder PRIMARY KEY NONCLUSTERED (SalesOrderID))

Noterete in questo articolo che di tanto in tanto in grassetto porzioni di codice. Questo è un meccanismo semplice ma efficace per aiutare voi "vedere la foresta per gli alberi", come discutiamo di un argomento. Ad esempio, mettendo in evidenza la frase di default in un blocco di codice, mentre default discutendo ti aiuta a acquisire rapidamente la parte più applicabili del codice, senza essere distratto dal resto durante la discussione. Questa dichiarazione di default inserisce automaticamente il risultato di GetDate SQL Server () function - la data e l'ora correnti, nella colonna SaleDate finché la colonna SaleDate non è una parte di INSERT. Se la colonna SaleDate fa parte del INSERT, il valore fornito dalla dichiarazione saranno utilizzati.

un articolo presentato da Linda Hastings


Disclaimer:Il nostro sito non è responsabile per il contenuto di questo articolo. Webarticles è una risorsa gratuita di informazioni.
Importante: Questo articolo "Creazione di un modello di dati fisici" è stato tradotto da un software automatico. Ci dispiace per eventuali errori di ortografia che possono essersi verificati. Grazie per la vostra comprensione.


Online: 343 users browsing the articles directory