SQL Server - Controllare il vincolo su una colonna in cui i valori provengono da un'altra tabella
-
12-09-2020 - |
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.
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.