اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
دو دقیقه
SQL Server قابلیت فعال(enable) و غیر فعال(disable) کردن دو قید کلید خارجی و check را برای ما مهیا کرده است.
ما میتوانیم بعد از ساخت جدول و انتشار مقداری داده در آن قیدهایی را ایجاد کنیم. بطور پیشفرض اگر شرط قید ما بر قرار بود قید به طور صحیح ساخته میشود و اگر شرط قید ما بر قرار نباشد قید با خطای conflict مواجه خواهد شد.
بطور کلی غیر فعال کردن قیدها کار درستی نیست. ولی در برخی مواقع برای تسریع در اجرای کد میتوانیم قید را غیر فعال کنیم. بطور مثال اگر یک میلیون داده قرار است در جدول درج شود و مطمئن هستیم که این دادهها جامعیت دادهها را حفظ میکنند آنگاه میتوانیم قید را برای تسریع در عمل درج بطور موفق غیر فعال کنیم.
فعال و غیر فعال کردن از طریق DDL
با غیر فعال کردن قیود دادهها را در وضعیت نامناسبی قرار میدهیم ولی همان طور که اشاره شد بطور موفق اشکالی پیش نخواهد آمد.
در ادامه ابتدا طریقه غیرفعال کردن و مجددا فعال کردن قیود را توسط دستور alter table نشان خواهم داد سپس به سراغ امکانات ویزاردی میرویم. ابتدا یک جدول تک ستونه ایجاد میکنیم:
الان هیچ قیدی روی جدول لحاظ نشده است. پس هر داده که در رنج domain ستون باشد را میتوانیم درج کنیم. پس بطور نمونه این دادهها را درج میکنیم:
حالا تصمیم داریم قیدی روی ستون column1 بگذاریم که توسط آن تنها اعداد مثبت در جدول درج شوند. پس داریم:
ولی چون داده هایی در جدول از قبل وجود داشته اند که قید ما را نقض کنند این قید ساخته نخواهد شد و با پیغام زیر مواجه خواهیم شد:
برای ساخت این قید روی این دادهها تنها راه استفاده از کلید واژههای WITH NOCHECK است یعنی:
و اکنون سعی میکنیم یک مقدار منفی در جدول درج کنیم:
اما قیدی که ساخته بودیم در جدول در حال اعمال شدن است. برای درج مقدار منفی باید غیر را غیر فعال کنیم.
و حالا مقدار منفی را درج میکنیم. و برای برگرداندن وضعیت NOCHECK به وضعیت CHECK باید از کلید واژههای WITH NOCHECK استفاده کنیم. چرا که داده هایی در جدول درج شده اند که قید مورد نظر ما را نقض میکنند.
فعال و غیر فعال کردن از طریق design
در قسمت object explorer قید مورد نظر را پیدا کرده و روی آن راست کلیک کرده و گزینه Modify را انتخاب کنید. سپس در پنجره باز شده در قسمت Table Designer تغییرات مورد نظر خود را اعمال کنید.
ما میتوانیم بعد از ساخت جدول و انتشار مقداری داده در آن قیدهایی را ایجاد کنیم. بطور پیشفرض اگر شرط قید ما بر قرار بود قید به طور صحیح ساخته میشود و اگر شرط قید ما بر قرار نباشد قید با خطای conflict مواجه خواهد شد.
بطور کلی غیر فعال کردن قیدها کار درستی نیست. ولی در برخی مواقع برای تسریع در اجرای کد میتوانیم قید را غیر فعال کنیم. بطور مثال اگر یک میلیون داده قرار است در جدول درج شود و مطمئن هستیم که این دادهها جامعیت دادهها را حفظ میکنند آنگاه میتوانیم قید را برای تسریع در عمل درج بطور موفق غیر فعال کنیم.
فعال و غیر فعال کردن از طریق DDL
با غیر فعال کردن قیود دادهها را در وضعیت نامناسبی قرار میدهیم ولی همان طور که اشاره شد بطور موفق اشکالی پیش نخواهد آمد.
در ادامه ابتدا طریقه غیرفعال کردن و مجددا فعال کردن قیود را توسط دستور alter table نشان خواهم داد سپس به سراغ امکانات ویزاردی میرویم. ابتدا یک جدول تک ستونه ایجاد میکنیم:
CREATE TABLE testTable (column1 integer not null);
الان هیچ قیدی روی جدول لحاظ نشده است. پس هر داده که در رنج domain ستون باشد را میتوانیم درج کنیم. پس بطور نمونه این دادهها را درج میکنیم:
INSERT INTO testTable VALUES (-10), (0), (10), (20), (30), (40)
حالا تصمیم داریم قیدی روی ستون column1 بگذاریم که توسط آن تنها اعداد مثبت در جدول درج شوند. پس داریم:
ALTER TABLE testTable WITH CHECK ADD CONSTRAINT NoNegative CHECK (column1 > 0);
The ALTER TABLE statement conflicted with the CHECK constraint "NoNegative".
برای ساخت این قید روی این دادهها تنها راه استفاده از کلید واژههای WITH NOCHECK است یعنی:
ALTER TABLE testTable WITH NOCHECK ADD CONSTRAINT NoNegative CHECK (column1 > 0);
و اکنون سعی میکنیم یک مقدار منفی در جدول درج کنیم:
INSERT INTO testTable VALUES (-5) /* The INSERT statement conflicted with the CHECK constraint "NoNegative". */
اما قیدی که ساخته بودیم در جدول در حال اعمال شدن است. برای درج مقدار منفی باید غیر را غیر فعال کنیم.
ALTER TABLE TestTable NOCHECK CONSTRAINT NoNegative
و حالا مقدار منفی را درج میکنیم. و برای برگرداندن وضعیت NOCHECK به وضعیت CHECK باید از کلید واژههای WITH NOCHECK استفاده کنیم. چرا که داده هایی در جدول درج شده اند که قید مورد نظر ما را نقض میکنند.
ALTER TABLE TestTable WITH NOCHECK CHECK CONSTRAINT NoNegative
فعال و غیر فعال کردن از طریق design
در قسمت object explorer قید مورد نظر را پیدا کرده و روی آن راست کلیک کرده و گزینه Modify را انتخاب کنید. سپس در پنجره باز شده در قسمت Table Designer تغییرات مورد نظر خود را اعمال کنید.