it-swarm-eu.dev

KONTROLA ALTER TABULKY KONTROLA

Z Průzkumníka objektů v SQL Server při výběru a skriptování omezení cizího klíče je generován následující kód.

     USE [MyTestDatabase]
     GO

     ALTER TABLE [dbo].[T2] WITH NOCHECK ADD CONSTRAINT [FK_T2_T1] FOREIGN KEY([T1ID])
     REFERENCES [dbo].[T1] ([T1ID])
     GO

     ALTER TABLE [dbo].[T2] CHECK CONSTRAINT [FK_T2_T1]
     GO

Jaký je účel posledního prohlášení „ALTER TABLE CHECK CONSTRAINT“? Nezdá se, že by záleželo na tom, zda je spuštěna. Nezpůsobí selhání na existujících chybných datech ani nezmění, že omezení bude vynucováno na nová data.

Dík!

25
Delux

Zajišťuje, že omezení je povoleno po jeho vytvoření. Vaše ALTER TABLE příkaz obsahuje WITH NOCHECK což je kus, který říká, že během vytváření omezení nekontroluje existující špatná data.

Jak bylo napsáno, stávající data nebudou zkontrolována proti omezení kvůli WITH NOCHECK v prvním výpisu. Vydání druhého příkazu umožní kontrolu proti omezení pro všechny budoucí změny v tabulce, na které se omezení vztahuje, až do okamžiku, kdy ALTER TABLE [dbo].[T2] NOCHECK CONSTRAINT [FK_T2_T1] se vydává.

Příkazy, jak jsou psány, v podstatě říkají „Vytvořte toto omezení cizího klíče, ale nekontrolujte je proti existujícím datům.

23
squillman

Váš první příkaz vytvoří zakázané omezení. Musí být povoleno a případně důvěryhodné. Následující zvláštní syntaxe zajistí, že vaše omezení je povoleno a důvěryhodné:

ALTER TABLE YourTable
      WITH CHECK CHECK CONSTRAINT YourConstraint;

Existuje velmi dobrý blogový příspěvek od Huga Kornelise, který jej podrobně vysvětluje: Můžete věřit svému omezení

7
A-K