Ako možno dočasne vypnúť obmedzenia cudzích kľúčov pomocou jazyka T-SQL?

Sú v serveri SQL Server podporované zakázané a povolené obmedzenia cudzích kľúčov? Alebo je mojou jedinou možnosťou zrušiť a potom znovu vytvoriť obmedzenia?

Riešenie

Ak chcete vypnúť všetky obmedzenia v databáze, stačí spustiť tento kód:

-- disable all constraints
EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

Ak ich chcete opäť zapnúť, spustite: (výpis je samozrejme nepovinný a je to len výpis tabuliek)

-- enable all constraints
exec sp_MSforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

Považujem to za užitočné pri napĺňaní údajov z jednej databázy do druhej. Je to oveľa lepší prístup ako zrušenie obmedzení. Ako ste spomínali, hodí sa to pri vypustení všetkých údajov v databáze a ich opätovnom naplnení (povedzme v testovacom prostredí).

Ak odstraňujete všetky údaje, môže vám pomôcť toto riešenie.

Niekedy sa tiež hodí vypnúť aj všetky spúšťače, kompletné riešenie si môžete pozrieť tu.

Komentáre (21)

http://www.sqljunkies.com/WebLog/roman/archive/2005/01/30/7037.aspx

-- Disable all table constraints

ALTER TABLE MyTable NOCHECK CONSTRAINT ALL

-- Enable all table constraints

ALTER TABLE MyTable WITH CHECK CHECK CONSTRAINT ALL

-- Disable single constraint

ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint

-- Enable single constraint

ALTER TABLE MyTable WITH CHECK CHECK CONSTRAINT MyConstraint
Komentáre (8)

Štandard SQL-92 umožňuje deklarovať konštantu ako DEFERRABLE, aby mohla byť odložená (implicitne alebo explicitne) v rámci transakcie. Bohužiaľ, v SQL Serveri táto funkcia podľa normy SQL-92 stále chýba.

Podľa mňa je zmena obmedzenia na NOCHECK podobná zmene štruktúry databázy za behu - zrušenie obmedzenia určite je - a je to niečo, čomu sa treba vyhnúť (napr. používatelia vyžadujú zvýšené oprávnenia).

Komentáre (0)