SQL Server - Controllare il vincolo su una colonna in cui i valori provengono da un'altra tabella

StackOverflow https://stackoverflow.com/questions/3200795

Domanda

Come si presenta un vincolo di controllo su una colonna in modo tale che la sua gamma di valori accettabili proviene da un'altra tabella, senza hardcoding?

Ecco un esempio semplificato:

OneManyTable
RoleID  TaskID
10      Val1
10      Val2
20      Val1
20      Val2


MetaDataTable
pkID    Class   Value
1       A       Val1
2       A       Val2
3       B       Val3
4       B       Val4
.

Voglio mettere un vincolo di controllo su Onemanytable.Taskid colonna in modo tale che i valori accettabili provengono da una colonna di altre tabelle, I.e. da metadatatabili.Value dove metadatatabili.class= 'a'

Ho già provato a creare un vincolo di controllo del formato

TaskID in (Select Value FROM MetadataTable where class= 'A')
.

Ma questo non è supportato.

D'altra parte il taskid in ('VAL1', 'VAL2') funziona come un vincolo di controllo in SQL2K8 (non in SQL2000!), ma non è accettabile a causa del hardcown.

Come ottenere ciò che voglio, sia che tramite il vincolo di controllo o un altro meccanismo di fantasia di cui non sono a conoscenza?

PS.Deve essere sul lato del database, nessun controllo lato client come è stato suggerito da qualcuno.

È stato utile?

Soluzione

Probabilmente non è una buona pratica per entrare, ma è possibile scrivere una funzione definita dall'utente che accetta il tuo TaskID come parametro e ha valutato il vero o il falso a seconda che il TaskID sia compreso o menoil tuo metadatalable.

che ti permetterà di ottenere la funzionalità che stai cercando - controllare i vincoli sono davvero destinati a essere semplici funzioni progettate per limitare il range di una colonna e il loro comportamento è stato progettato con quello in mente, quindi è per questo che tuNon è possibile scrivere sottostizie all'interno di un vincolo di controllo in SQL Server.

È comunque possibile scrivere un'istruzione Selezione all'interno di una funzione definita dall'utente e chiamarlo da un vincolo di controllo.

Altri suggerimenti

Un vincolo di controllo contro i valori da un'altra tabella sarebbe in genere progettata come un vincolo chiave estero.Questo è il meccanismo progettato per collegare la tabella sui valori.

Controllare i vincoli sono progettati solo per definire

    .
  • Valori minimi o massimi
  • gamme
  • Enumerazioni di un determinato insieme di valori

Quindi non penso che tu possa fare ciò che stai cercando di fare, perché è davvero la caratteristica sbagliata che stai cercando di usare per questo.

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