PDA

View Full Version : چک کردن سال شروع و پایان در دو جدول



piroozman
چهارشنبه 13 آبان 1388, 15:31 عصر
در دیتابیس دو جدول با نام های dev و plans وجود دارد. در جدول dev دو ستون بانامهای beginingYear و endingYear وجود دارد. همین ستونها با همین نام و همین نوع در جدول plans نیز وجود دارد. ضمن این که کلید اصلی جدول dev با نام devId کلید خارجی در جدول plans است. حال می خواهیم وقتی سال شروع و پایان در جدول plans درج می شود، مقدار آن خارج از محدوده سال شروع و پایان جدول dev نباشد. چگونه می توانم این قید را جداول خود ایجاد کنم؟ قبلا از پاسخگویی شما تشکر می کنم

محمد سلیم آبادی
چهارشنبه 13 آبان 1388, 16:12 عصر
وقتی سال شروع و پایان در جدول plans درج می شود، مقدار آن خارج از محدوده سال شروع و پایان جدول dev نباشد.
یعنی داده های شروع و پایان در بین داده های جدول dev در سطری که برابر با devid از جدول plans باشد.

فقط کافیه یک Check constraint بر پایه ی UDF زیر ایجاد کنید: (متاسفانه نوع داده ی ستون های سال شروع و سال پایان را نفرمودین، من ستون های شما را از نوع datetime در نظر گرفته و از تابع year برای محاسبه ی سال مورد نظر استفاده خواهم کرد)




Create Function check_year (@devid int, @begin datetime, @end datetime) returns bit as
begin
Declare @b bit
if exists (select *
from dev
where @devid = devid
and @begin between beginingYear and endYear
and @end between beginingYear and endYear)
set @b = 1
else
set @b = 0

Return @b
end
GO

Alter Table plans
Add Constraint CK_Year
Check ( dbo.check_year ( devid, beginingYear, endingYear) = 1 )
GO


البته قیود دیگری نیز در دو جدول شما احتیاج دارین. به طور مثال نباید تاریخ شروع از تایخ پایان بزرگ تر باشد.
و البته نیز راه های متعددی برای ایجاد قیود در سطح بانک وجود دارد که یکی دیگر از مکانیزم های آن استفاده از Trigger می باشد.

محمد سلیم آبادی
چهارشنبه 13 آبان 1388, 16:45 عصر
ناگفته نماند که check constraint فوق data integrity بانکتان را تضمین نخواهد کرد!
اگر بعد ایجاد سطر مورد نظر مقادیر سال شروع و پایان جدول اصلی (dev) تغییر کند، دو حالت وجود دارد اول اینکه ممکن است داده های جدول تابع یعنی plans با داده های جدول dev مطابق داشته که در این حالت مشکلی وجود ندارد و حالت بعدی این است که داده این بار تطابق نداشته باشند، شما در این مرحله، از داده هایتان چه انتظاری دارید؟ آیا این قید مکانیزمی را برای تظمین داده های شما در اختیارتان قرار می دهد؟
پس برای طراحی بانک بایستی زحمت لازم را کشید تا جامعیت به معنای واقعی به وقوع بپیوند.