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?
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.
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
Š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).