<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>constraints &#8211; SQLpowered.com</title>
	<atom:link href="https://sqlpowered.com/tag/constraints/feed/" rel="self" type="application/rss+xml" />
	<link>https://sqlpowered.com</link>
	<description>SQL Server + BI</description>
	<lastBuildDate>Sat, 31 Dec 2022 15:25:20 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://sqlpowered.com/wp-content/uploads/2020/07/FavIcon-e1594067873682-99x100.png</url>
	<title>constraints &#8211; SQLpowered.com</title>
	<link>https://sqlpowered.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Foreign keys and differences between CHECK, NOCHECK and WITH CHECK options</title>
		<link>https://sqlpowered.com/foreign-keys-check-nocheck-and-with-check/</link>
					<comments>https://sqlpowered.com/foreign-keys-check-nocheck-and-with-check/#comments</comments>
		
		<dc:creator><![CDATA[Jan Dvořák]]></dc:creator>
		<pubDate>Fri, 24 May 2019 07:16:19 +0000</pubDate>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[constraints]]></category>
		<guid isPermaLink="false">https://sqlpowered.com/?p=3130</guid>

					<description><![CDATA[It&#8217;s confusing that developers are still doing fails when using CHECK, NOCHECK and WITH CHECK/NOCHECK clauses because they don&#8217;t know exactly what are differences between them. To be honest, it&#8217;s not a very native and clear part of SQL syntax. Let&#8217;s go to make this a little bit more clear...]]></description>
										<content:encoded><![CDATA[<p>It&#8217;s confusing that developers are still doing fails when using CHECK, NOCHECK and WITH CHECK/NOCHECK clauses because they don&#8217;t know exactly what are differences between them. To be honest, it&#8217;s not a very native and clear part of SQL syntax. Let&#8217;s go to make this a little bit more clear and repeat some fundamental things.</p>
<p>First I will create two tables with data which I will later try to connect with the foreign key:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="sql">DROP TABLE [dbo].[SalesOrderItem]
DROP TABLE [dbo].[SalesOrder]

GO

CREATE TABLE dbo.SalesOrder
(
	SalesOrder_ID INT NOT NULL PRIMARY KEY
)
GO

CREATE TABLE dbo.SalesOrderItem
( SalesOrderItem_ID INT NOT NULL PRIMARY KEY,
 SalesOrder_ID INT NOT NULL
 )
 GO

 INSERT INTO dbo.[SalesOrder] 
	( [SalesOrder_ID] )
	VALUES (1), (2), (3), (4), (5)
GO

INSERT INTO dbo.[SalesOrderItem] ( [SalesOrderItem_ID], [SalesOrder_ID] )
	VALUES (1,1), (2,2), (3,3), (4,4), (5,5), (6,6)
GO
</pre>
<p><img fetchpriority="high" decoding="async" class="alignnone size-full wp-image-3137" src="https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_1-1.png" alt="" width="258" height="283" srcset="https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_1-1.png 258w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_1-1-91x100.png 91w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_1-1-146x160.png 146w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_1-1-223x245.png 223w" sizes="(max-width: 258px) 100vw, 258px" /></p>
<p>As you can see we did a mistake at row six: data are inconsistent because no such Order exists in dbo.SalesOrder table with SalesOrder_ID = 6. We will test it with different kinds of foreign key creation now.</p>
<p>We will try to create a foreign key between tables dbo.SalesOrderItem and dbo.SalesOrder using WITH CHECK constraint now:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="sql">ALTER TABLE [dbo].[SalesOrderItem] WITH CHECK ADD 
	CONSTRAINT [FK_SalesOrderItem_SalesOrder_SalesOrder_ID] 
		FOREIGN KEY ([SalesOrder_ID]) REFERENCES [dbo].[SalesOrder]([SalesOrder_ID])
GO</pre>
<p><img decoding="async" class="alignnone size-full wp-image-3134" src="https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_2.png" alt="" width="804" height="49" srcset="https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_2.png 804w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_2-150x9.png 150w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_2-300x18.png 300w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_2-768x47.png 768w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_2-160x10.png 160w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_2-320x20.png 320w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_2-520x32.png 520w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_2-720x44.png 720w" sizes="(max-width: 804px) 100vw, 804px" /></p>
<p>Key creation has failed because clause WITH CHECK means that SQL Server will check the consistency of existing data and create the foreign key only in case when all data match to constraint enforced by the key.</p>
<p>Yes, there is an option how to skip this consistency check and accept that the key will be created and used for future data, but existing data will stay inconsistent:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="sql">ALTER TABLE [dbo].[SalesOrderItem] WITH NOCHECK ADD 
	CONSTRAINT [FK_SalesOrderItem_SalesOrder_SalesOrder_ID] 
		FOREIGN KEY ([SalesOrder_ID]) REFERENCES [dbo].[SalesOrder]([SalesOrder_ID])
GO</pre>
<p>Except data to be inconsistent is looks like there is no other issue using the NOCHECK option. But that&#8217;s not true. We have created a serious problem for the performance of future queries executed over these two tables. Foreign key created using NOCHECK option was created as an untrusted one which means that it won&#8217;t be used by query optimizer when building the most effective execution plan later. We can verify that fact in metadata:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="sql">SELECT name, [is_not_trusted] FROM sys.[foreign_keys]
GO</pre>
<p><img decoding="async" class="alignnone size-full wp-image-3139" src="https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_5.png" alt="" width="414" height="41" srcset="https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_5.png 414w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_5-150x15.png 150w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_5-300x30.png 300w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_5-160x16.png 160w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_5-320x32.png 320w" sizes="(max-width: 414px) 100vw, 414px" /></p>
<p>You can read more about the difference between trusted and untrusted foreign keys in this <a href="https://sqlpowered.com/582/">post</a>.</p>
<p>We will try to delete a few rows from dbo.SalesOrder table now: first the row number 6 without valid reference to dbo.SalesOrder table and then the one with number 1  having matching Order:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="sql">DELETE FROM [dbo].[SalesOrder] WHERE [SalesOrder_ID] = 6
GO

DELETE FROM [dbo].[SalesOrder] WHERE [SalesOrder_ID] = 1
GO</pre>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-3140" src="https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_6.png" alt="" width="757" height="87" srcset="https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_6.png 757w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_6-150x17.png 150w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_6-300x34.png 300w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_6-160x18.png 160w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_6-320x37.png 320w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_6-520x60.png 520w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_6-720x83.png 720w" sizes="auto, (max-width: 757px) 100vw, 757px" /></p>
<p>First DELETE statement was successful and the second one failed because there exists real reference between the Order and OrderItem.</p>
<p>If we would like to override this error we can switch the foreign key temporary off using NOCHECK option:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="sql">ALTER TABLE dbo.[SalesOrderItem] NOCHECK CONSTRAINT [FK_SalesOrderItem_SalesOrder_SalesOrder_ID]
GO</pre>
<pre class="EnlighterJSRAW" data-enlighter-language="sql">DELETE FROM [dbo].[SalesOrder] WHERE [SalesOrder_ID] = 1
GO</pre>
<p>With disabled foreign keys we can do any operations with data like when the key isn&#8217;t presented. But from that moment our data are uncontrolled and any kind of inconsistency is possible. And, as mentioned above, we caused the key to be untrusted with all the difficulties mentioned above.</p>
<p>Most mistakes are happening when we will try to adjust the key to be used again. There are two ways how to achieve that:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="sql">ALTER TABLE dbo.[SalesOrderItem] 
CHECK CONSTRAINT [FK_SalesOrderItem_SalesOrder_SalesOrder_ID]
GO</pre>
<p>SQL Server will activate foreign key for future data changes but doesn&#8217;t check if existing data are consistent and the key is still marked as untrusted in the metadata. Therefor statement has been completed successfully.</p>
<p>Adding WITH CHECK option will modify this behavior to be strict and enforce data integrity check before foreign key creation:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="sql">ALTER TABLE dbo.[SalesOrderItem] 
WITH CHECK
CHECK CONSTRAINT [FK_SalesOrderItem_SalesOrder_SalesOrder_ID]
GO</pre>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-3142" src="https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_7.png" alt="" width="804" height="50" srcset="https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_7.png 804w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_7-150x9.png 150w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_7-300x19.png 300w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_7-768x48.png 768w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_7-160x10.png 160w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_7-320x20.png 320w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_7-520x32.png 520w, https://sqlpowered.com/wp-content/uploads/2019/05/CHECK__NOCHECK_7-720x45.png 720w" sizes="auto, (max-width: 804px) 100vw, 804px" /></p>
<p>The statement has failed because we have deleted Order with number 1 from table dbo.SalesOrder in the previous testing. We should first correct the data and delete the invalid row from dbo.SalesOrderItem or add Order with number 1 into dbo.SalesOrder table again.</p>
<p>Proper management of foreign keys is a key factor if we would like to have consistent and well-performing databases.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlpowered.com/foreign-keys-check-nocheck-and-with-check/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Zakázání a povolení všech constraintů nad tabulkou</title>
		<link>https://sqlpowered.com/zakazani-a-povoleni-vsech-constraintu-nad-tabulkou/</link>
					<comments>https://sqlpowered.com/zakazani-a-povoleni-vsech-constraintu-nad-tabulkou/#respond</comments>
		
		<dc:creator><![CDATA[Jan Dvořák]]></dc:creator>
		<pubDate>Sun, 05 Jul 2015 07:03:11 +0000</pubDate>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[constraints]]></category>
		<guid isPermaLink="false">https://sqlpowered.com/?p=711</guid>

					<description><![CDATA[Při práci s tabulkami, které mají cizí klíče zajišťující integritu dat, často řešíme problém, jak tyto klíče a jiná omezení dočasně vypnout, abychom mohli například provést změnu dat v tabulce, rychlý import velkého množství dat či manipulaci s jinou tabulkou, na kterou se původní tabulka odkazuje. Cizí klíče a jiná...]]></description>
										<content:encoded><![CDATA[<p>Při práci s tabulkami, které mají cizí klíče zajišťující integritu dat, často řešíme problém, jak tyto klíče a jiná omezení dočasně vypnout, abychom mohli například provést změnu dat v tabulce, rychlý import velkého množství dat či manipulaci s jinou tabulkou, na kterou se původní tabulka odkazuje. Cizí klíče a jiná omezení můžeme pochopitelně zakázat ručně například odstraněním v Management Studiu a opětovným vytvořením nebo přípravou skriptu pro jednotlivé klíče. Existuje však i jednodušší metoda, kdy lze pomocí několika příkazů naráz zakázat i povolit všechny cizí klíče a omezení tabulky a následně provést kontrolu integrity dat.<span id="more-711"></span></p>
<p>Pomocí následujícího skriptu nejprve vytvoříme testovací databázi a v ní tři tabulky: Tabulku Orders (Objednávky) a k ní rodičovské tabulky Customer(Zákazník) a Store (Obchod):</p>
<pre class="lang:tsql decode:true">CREATE DATABASE TestDB
GO

CREATE TABLE Customers (
	Customer_ID INT NOT NULL PRIMARY KEY,
	CustomerName NVARCHAR(100)
)
GO

CREATE TABLE Stores (
	Store_ID INT NOT NULL PRIMARY KEY,
	StoreName NVARCHAR(100)
)
GO

CREATE TABLE Orders (
	Order_ID INT NOT NULL PRIMARY KEY,
	Customer_ID INT NOT NULL,
	Store_ID INT NOT NULL,
	OrderDate DATETIME NOT NULL,
	OrderAmount INT NOT NULL
)</pre>
<p>Nyní vytvoříme mezi tabulkou Orders a tabulkami Customers a Stores cizí klíče, které zajistí, že nebude možné z tabulek Customers a Stores odstranit záznamy, pokud k nim existují nějaké objednávky:</p>
<pre class="lang:tsql decode:true ">ALTER TABLE dbo.Orders ADD CONSTRAINT FK_Orders_Customers FOREIGN KEY (	Customer_ID	) 
	REFERENCES dbo.Customers ( Customer_ID )
GO
ALTER TABLE dbo.Orders ADD CONSTRAINT FK_Orders_Stores FOREIGN KEY ( Store_ID ) 
	REFERENCES dbo.Stores ( Store_ID )
GO</pre>
<p>Výsledná struktura vypadá v Management Studiu takto:</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1058" src="https://sqlpowered.com/wp-content/uploads/2015/06/Disabling-Table-Constraints-Structure.png" alt="Disabling-Table-Constraints-Structure" width="289" height="396" /></p>
<p>Do tabulek vložíme testovací data:</p>
<pre class="lang:tsql decode:true ">INSERT INTO Customers
	( Customer_ID, CustomerName )
	SELECT 1, 'Customer1' UNION ALL
	SELECT 2, 'Customer2' UNION ALL
	SELECT 3, 'Customer3'
GO

INSERT INTO Stores
	( Store_ID, StoreName )
	SELECT 1, 'Store1' UNION ALL
	SELECT 2, 'Store2'
GO

INSERT INTO Orders
	( Order_ID, Customer_ID, Store_ID, OrderDate, OrderAmount )
	SELECT 1, 1, 1, '2014-05-01', 500 UNION ALL
	SELECT 2, 2, 2, '2014-05-02', 1000 UNION ALL
	SELECT 3, 3, 2, '2014-05-03', 1500
GO</pre>
<p>Výsledek vypadá takto:</p>
<pre class="lang:tsql decode:true ">SELECT * FROM Customers
SELECT * FROM Stores
SELECT * FROM Orders
GO</pre>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1059" src="https://sqlpowered.com/wp-content/uploads/2015/06/Disabling-Contraints-Sample-Data.png" alt="Disabling-Contraints-Sample-Data" width="449" height="225" /></p>
<p>Ověříme funkčnost cizích klíčů tím, že se pokusíme vymazat Zákazníka nebo Obchod aniž bychom nejprve odstranili závislé záznamy z tabulky Objednávek:</p>
<pre class="lang:tsql decode:true ">DELETE FROM Customers WHERE Customer_ID = 1
GO

DELETE FROM Stores WHERE Store_ID = 1
GO</pre>
<p>Výsledkem je chyba:</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1061" src="https://sqlpowered.com/wp-content/uploads/2015/06/FK-Delete-Error.png" alt="FK-Delete-Error" width="586" height="66" /></p>
<p>Server nás upozorní, že odstranění není možné, protože cizí klíč FK_Orders_Store vynucuje, že tabulka Orders může obsahovat ve sloupci Store_ID pouze platná ID z tabulky Stores.</p>
<p>Vytvořené cizí klíče můžeme zkontrolovat pomocí dotazu do metadat &#8211; systémový pohled <a href="https://msdn.microsoft.com/en-us/library/ms189807.aspx" target="_blank" rel="noopener noreferrer">sys.foreign_keys</a>:</p>
<pre class="lang:tsql decode:true">SELECT 
	name FK_Name, OBJECT_NAME(parent_object_id) ParentObject, OBJECT_NAME(referenced_object_id) ReferencedObject, 
	is_disabled, is_not_trusted
FROM sys.foreign_keys fk
GO</pre>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1064" src="https://sqlpowered.com/wp-content/uploads/2015/06/Foreign-Key-Metadata.png" alt="Foreign-Key-Metadata" width="493" height="58" /></p>
<ul>
<li>ParentObject je objekt, na kterém je cizí klíč umístěn</li>
<li>ReferencedObject je objekt, který obsahuje hodnoty (ID), jejichž integritu cizí cizí klíč zajišťuje</li>
<li>is_disabled &#8211; říká, zda je cizí klíč povolen nebo zakázán</li>
<li>is_not_trusted &#8211; říká, zda je cizí klíč důvěryhodný.</li>
</ul>
<p>U is_not_trusted se na chvíli zastavme. Pokud cizí klíč nad tabulkou zakážeme a opět povolíme, systém neví, zda po uvedenou dobu došlo či nedošlo ke změně dat, která mohla vést k tomu, že do tabulky se dostaly záznamy, které by tam nebylo možné vložit tehdy, pokud by cizí klíč byl stále aktivní. Podobný scénář si ukážeme dále. Důvěryhodnosti cizích klíčů je třeba věnovat pozornost, protože důvěryhodné cizí klíče dokáže velmi obratně využití optimalizátor, protože se například nemusí dotazovat do jiné tabulky, když pomocí důvěryhodného klíče ví, že se v ní hledaná hodnota nemůže vyskytovat.</p>
<p>Nyní přistoupíme ke změně nastavení cizích klíčů a pomocí NOCHECK CONTRAINT ALL všechny cizí klíče nad tabulkou Orders zakážeme:</p>
<pre class="lang:tsql decode:true ">ALTER TABLE Orders NOCHECK CONSTRAINT ALL
GO</pre>
<p>Dotazem do metadat se podíváme, zda bylo nastavení cizích klíčů skutečně změněno:</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1067" src="https://sqlpowered.com/wp-content/uploads/2015/06/Disabled-Foreign-KEys-Metadata.png" alt="Disabled-Foreign-KEys-Metadata" width="493" height="58" /></p>
<p>Vidíme, že se změnilo jak nastavení is_disable z 0 na 1, tedy cizí klíče byly zakázány, ale zároveň se změnilo i nastavení jejich důvěryhodnosti, protože nyní nemám SQL Server žádnou kontrolu nad integritou dat a klíče jsou jako nedůvěryhodné vyřazeny z použití optimalizátoru, což v důsledku může znamenat i to, že budou přegenerovány existující exekuční plány, které počítali s existencí důvěryhodných klíčů.</p>
<p>Nyní se pokusme znovu smazat data z tabulek Customers a Stores:</p>
<pre class="lang:tsql decode:true ">DELETE FROM Customers WHERE Customer_ID = 1
GO

DELETE FROM Stores WHERE Store_ID = 1
GO

(1 row(s) affected)

(1 row(s) affected)
</pre>
<p>Vidíme, že oba záznamy byly úspěšně smazány a nevrací se nám chyba upozorňující na porušení omezení jako dříve. Pokud si prohlédneme data, jasně vidíme, že v tabulce Orders zůstala IDčka právě smazaný Zákazníků a Obchodů:</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1069" src="https://sqlpowered.com/wp-content/uploads/2015/06/Foreign-Keys-Data-After-Delete.png" alt="Foreign-Keys-Data-After-Delete" width="449" height="194" /></p>
<p>Nyní opět povolíme cizí klíče:</p>
<pre class="lang:tsql decode:true ">ALTER TABLE Orders CHECK CONSTRAINT ALL
GO</pre>
<p>Ověříme jejich funkčnost:</p>
<pre class="lang:tsql decode:true ">DELETE FROM Customers WHERE Customer_ID = 2
GO

DELETE FROM Stores WHERE Store_ID = 2
GO</pre>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-1061" src="https://sqlpowered.com/wp-content/uploads/2015/06/FK-Delete-Error.png" alt="FK-Delete-Error" width="586" height="66" /></p>
<p>Vidíme, že cizí klíče opět kontrolují integritu dat a brání vzniku nevalidních referencí. Ovšem pokud se podíváme do metadat, tak kromě toho, že máme ve skutečnosti v tabulkách nevalidní reference, tak naše cizí klíče jsou stále nedůvěryhodné:</p>
<pre class="lang:tsql decode:true">SELECT 
	name FK_Name, OBJECT_NAME(parent_object_id) ParentObject, OBJECT_NAME(referenced_object_id) ReferencedObject, 
	is_disabled, is_not_trusted
FROM sys.foreign_keys fk
GO</pre>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1071" src="https://sqlpowered.com/wp-content/uploads/2015/06/Foreign-Key-Not-Trusted.png" alt="Foreign-Key-Not-Trusted" width="493" height="58" /></p>
<p>Jak k této situaci došlo? Když jsme výše povolovali cizí klíče pomocí ALTER TABLE&#8230; CHECK CONTRAINTS ALL, neuvedli jsme WITH CHECK, která znamená, že SQL Server při povolení cizích klíčů provede i fyzickou kontrolu dat. Nyní spustíme tento příkaz znovu se správných nastavením:</p>
<pre class="lang:tsql decode:true ">ALTER TABLE Orders WITH CHECK CHECK CONSTRAINT ALL
GO</pre>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1072" src="https://sqlpowered.com/wp-content/uploads/2015/06/ForeignKey-Check-Contraint-All.png" alt="ForeignKey-Check-Contraint-All" width="642" height="45" /></p>
<p>Chybové hlášení nás upozorní, že cizí klíč FK_Orders_Customers nelze povolit, protože došlo ke konfliktu s tabulkou Customers, sloupcem Customer_ID, kde se nepodařilo najít všechny hodnoty, na které se odkazuje sloupec Customer_ID.</p>
<p>Jedinou možností, jak opět povolit cizí klíče a dosáhnout jejich důvěryhodnosti, je opravit data tak, aby byla zachována pravidla integrity vynucovaná cizími klíči. Můžeme smazat nevalidní záznamy z tabulky Orders, případně je převést na existující záznamy z tabulek Customers a Stores, nebo v těchto tabulkách opět vytvořit chybějící záznamy.</p>
<div class="text">
<pre class="code">ALTER TABLE dbo.TestTable NOCHECK CONSTRAINT ALL
GO

-- TODO

ALTER TABLE dbo.TestTable CHECK CONSTRAINT ALL
GO

DBCC CHECKCONSTRAINTS('dbo.TestTable')
GO</pre>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlpowered.com/zakazani-a-povoleni-vsech-constraintu-nad-tabulkou/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
