Ali sta v strežniku SQL Server podprta onemogočanje in omogočanje omejitev tujih ključev? Ali pa je moja edina možnost, da omejitve izpustim in jih nato znova ustvarim?
Če želite onemogočiti vse omejitve v zbirki podatkov, zaženite to kodo:
-- disable all constraints
EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
Če jih želite ponovno vklopiti, zaženite: (izpis je seveda neobvezen in samo našteje tabele)
-- enable all constraints
exec sp_MSforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
To se mi zdi uporabno pri polnjenju podatkov iz ene zbirke podatkov v drugo. To je veliko boljši pristop kot opuščanje omejitev. Kot ste omenili, je priročen, ko opustite vse podatke v zbirki podatkov in jih ponovno napolnite (recimo v testnem okolju).
Če brišete vse podatke, vam bo morda v pomoč ta rešitev.
Včasih je prav tako priročno onemogočiti vse sprožilce, celotno rešitev si lahko ogledate tukaj.
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
Standard SQL-92 dovoljuje, da je konstanto deklarirano kot ODLOŽENO, tako da jo je mogoče odložiti (implicitno ali eksplicitno) v okviru transakcije. Na žalost v strežniku SQL Server še vedno ni te funkcionalnosti standarda SQL-92.
Zame je sprememba omejitve v NOCHECK podobna sprotnemu spreminjanju strukture podatkovne zbirke - opustitev omejitev zagotovo je - in nekaj, čemur se je treba izogibati (npr. uporabniki potrebujejo večje privilegije).