View Full Version : فيلد خاص
behroz1387
چهارشنبه 25 آذر 1388, 18:06 عصر
دوستان عزيز با سلام
آيا مي شه فيلدي را بگونه اي طراحي كرد كه غير از صفر ورودي تكراري را نگيرد
بزبان ساده تر اگه صفر وارد شد آنرا قبول كند با وجود اينكه در اين فيلد قبلا صفر باشد ولي اگه عدد بيشتر از صفر وارد شد چك كند اگه قبلا وارد شده باشد آنرا نگيرد اما اگه براي اولين بار وارد شود انرا ذخيره كند
با تشكر
محمد سلیم آبادی
چهارشنبه 25 آذر 1388, 19:20 عصر
سلام دوست عزیز،
بله این امکان وجود دارد با کمک check constraint based on UDF و Trigger.
در روش check دیگر نیاز به row-by-row processing وجود ندارد.
سوالی که من از شما دارم این است که آیا در مورد مقدار null نیز تکراری بودن (duplicate) دارای اهمیت است؟
sia_2007
چهارشنبه 25 آذر 1388, 19:45 عصر
سلام
این یه مثال کاملا کاربردیه !
برای مثال در شرکتها؛ فیلد پاسپورت همین حالت رو داره
اگه نداشته باشه ؛ Null میگیره ؛ پس چندین Null وجود داره؛
در عین حال اگه باشه؛ باید Unique باشه.
خب شما رو اون فیلد یه Index درست کن؛ تیک Unique بودن رو بزن.
بعدش در آخرین بخش ؛ در Filter؛ بنویس :
passport filter by is null
البته من این کد رو یک ماه پیش نوشتم؛ الآن دقیق یادم نیست.
99% همینه
اما خب مفهموم رو گرفتی.
---
جای دیگه ای که این امر کاربرد داره :
مثلا رو شهرها میخواهیم ایندکس بذاریم. (مثاله دیگه؛ وگرنه تو طراحی واقعی این طوری نیست)
خب اگه مقدار فراوانی یک شهر در دیتابیس کم باشد؛ SQL از ایندکس استفاده میکند؛ نه در حالات دیگر
مثلا فرض کن تو 1000 تا شهر ؛ 623 تاش ؛ تهرانه ، 5 تاش شاهین شهر که شهر منه.
موقعی که شما تهران رو میخونی ؛ SQL از ایندکس استفاده نمیکنه چون براش صرف نداره.
اما برای شاهین شهر حتما استفاده میکنه ؛ چون براش صرف داره.
حالا شما میتونی تو ایندکست تهران رو فیلتر کنی ؛ دیگه نه بی جهت وارد کردن دیتاهات برای تهران کند میشه؛ نه ایندکست بزرگ میشه و ...
البته بنا به شرایط مختلف این قضیه فرق میکنه
موفق باشی
sia_2007
چهارشنبه 25 آذر 1388, 19:53 عصر
دوستان کسی اطلاع داره که
Change Tracking
و
Change Data Capture
چه جوری کار میکنند ؟
اینها رو من فهمیدم :
فقط تو SQL Server 2008 Enterprise & Developer هستند.
اولی :
چه رکوردی با Insert Update Delete دست خورده ؛ نسبت به آخرین Sync
تو مایه های Replication
دومی :
Log کردن با تریگر ما رو خیلی سریع تر با خوندن فایل ldf انجام میده.
دوستان این مثل بحث Locking و کد نمایش تراکنش ها ، خیلی با ارزشه؛
کمک کنید یه مبحث عالی رو با کمک هم دیگه یاد بگیریم.
منتظرم
behroz1387
چهارشنبه 25 آذر 1388, 21:56 عصر
دوستان عزيز با تشكر از توجهتان
جناب msalim ممنون كه توجه نموديد نه مهم نيست و فقط مي خواهم كه آنهايي كه وارد مي شود تكراري نباشد
محمد سلیم آبادی
پنج شنبه 26 آذر 1388, 06:59 صبح
دو راه حل به شما پیشنهاد می کنم، که راه حل استفاده از CHECK را در اولویت قرار داده و به شما توصیه می کنم که از این روش استفاده کنین (به دلایل مختلف)
من نام ستون مورد نظر شما را از نوع Int و با نام Column_Name فرض کرده و نام جدول شما را your_table گرفتم (لازم است قبل از اجرای یکی از این دو راه حل نام ها را تعویض کنین)
#1
create function dbo.CustomUQ (@value int) returns bit as
begin
declare @b bit
if @value = 0
set @b = 1
else if not exists
(select *
from your_table
where column_name = @value)
set @b = 1
else
set @b = 0
return @b
end
go
alter table your_table
add constraint UQ_01
check ( dbo.CustomUQ ( Column_name ) = 1 )
go
#2
create trigger trg_UQ
on your_table
instead of insert, update
as
begin
declare @v int
select @v = column_name from inserted
if @v = 0 or not exists
(select *
from your_table
where column_name = @v)
insert into your_table
select * from inserted
else
raiserror ('Duplicate Value',16,1)
end
sia_2007
پنج شنبه 26 آذر 1388, 10:12 صبح
ببخشید؛ مشکل با ایندکس حل نشد ؟
یه ایندکس Unique با فیلتر صفر
هر چند تا خواستین ردیف صفر بذارین
غیر صفر هر چی زدین باید فقط یک بار باشه.
خواستید Null رو هم فیلتر کنید.
چه روشی از این راحت تر ؛ امن تر وسریع تر ؟
حداقل مزیت ایندکس اینه که وقتی میخواد تکراری بودن ورودی رو ببینه ؛ میآد از باینری سرچ استفاده میکنه و خیلی سریع تر میفهمه که تکراری هست یا نه ؟
در روش تریگر؛ رکورد نوشته میشه؛ بعد تازه تریگر فایر میشه ؛ بعد کل دیتا رو بدون باینری سرچ و به کندی میگرده ؛ اگه تکراری بود ؛ تازه Rollback میکنه.
کندی Fun هم که دیگر بر کسی پوشیده نیست.
متاسفانه در این Fun هم دیتا از اول تا آخر خونده میشه ؛ هر چند که مشکل Rollback نیست؛ ولی خود Fun واقعا کنده.
در این ایندکس ؛ هم جستجوی اطلاعات سریع تره ؛ هم اگر دیتا تکراری بود؛ نمیگذاره دیتا وارد بشه ؛ تا تازه بخواد Rollback کنه
و نه تنها سرعت درج و ویرایش اطلاعات از 2 روش دیگر خیلی سریعتر است ؛ که موقع خواندن نیز از همون ایندکس استفاده میشه و سرعتی که اون موقع کم شده بود؛ حالا جبران میشه.
سری که درد نمیکنه رو که دستمال نمیبندند.
ولی در نهایت خودتان میدانید.
موفق باشی
محمد سلیم آبادی
پنج شنبه 26 آذر 1388, 10:56 صبح
ببخشید؛ مشکل با ایندکس حل نشد ؟
یه ایندکس Unique با فیلتر صفر
هر چند تا خواستین ردیف صفر بذارین
غیر صفر هر چی زدین باید فقط یک بار باشه.
خواستید Null رو هم فیلتر کنید.
...
Filtered Unique Index راه حل درسته! حق با شماست.
دوستان عزيز با سلام
آيا مي شه فيلدي را بگونه اي طراحي كرد كه غير از صفر ورودي تكراري را نگيرد
بزبان ساده تر اگه صفر وارد شد آنرا قبول كند با وجود اينكه در اين فيلد قبلا صفر باشد ولي اگه عدد بيشتر از صفر وارد شد چك كند اگه قبلا وارد شده باشد آنرا نگيرد اما اگه براي اولين بار وارد شود انرا ذخيره كند
با تشكر
اینم امتحان کنین:
create unique nonclustered index IX_test
on your_table (column_name)
where (column_name is not null) and (column_name <> 0)
behroz1387
پنج شنبه 26 آذر 1388, 12:07 عصر
دوست عزيز جناب sia 2007 من يك ايندكس باز كردم و is unique را برابر yes قرار دادم اما فيلتري نمي بينم كه برابر صفر قرار دهم
ممنون مي شم اگه كمك كنيد
محمد سلیم آبادی
پنج شنبه 26 آذر 1388, 12:09 عصر
دوست عزيز جناب sia 2007 من يك ايندكس باز كردم و is unique را برابر yes قرار دادم اما فيلتري نمي بينم كه برابر صفر قرار دهم
ممنون مي شم اگه كمك كنيد
script ای که در آخر پست شماره 8 وجود دارد را اجرا کنین
behroz1387
پنج شنبه 26 آذر 1388, 21:53 عصر
دوست عزيز جناب sia 2007 من يك ايندكس باز كردم و is unique را برابر yes قرار دادم اما فيلتري نمي بينم كه برابر صفر قرار دهم
ممنون مي شم اگه كمك كنيد
sia_2007
جمعه 27 آذر 1388, 13:57 عصر
من قبلا به این سوال جواب داده بودم؛ ولی حالا نمیبینمش !
دوست عزیز
حالت Tab در این پنجره در سمت چپ ایجاد شده.
نام یکی از Tab ها که آخرین Tab هستش؛ Filter است.
شاید هم اشتباه میکنم؛ ولی آخرین Tab هستش
یه Text Box داره؛ متنی رو که میخوای داخلش بنویس
موفق باشی
sia_2007
جمعه 27 آذر 1388, 21:01 عصر
این قدر ها هم مشکل نیست
sia_2007
جمعه 27 آذر 1388, 21:03 عصر
Tab فیلتر انتخاب شده
میبینید که 2 بار ورودی Null مشکلی رو ایجاد نکرده؛ ولی تکرار اسم Ali ؛ باعث ایجاد مشکل شده.
کدی که مدیر بخش قرار داده بودند هم همین کار را میکرد.
behroz1387
یک شنبه 29 آذر 1388, 21:41 عصر
دوست عزيز اينو خودم انجام دادم اما تب spatial و filter نداره م همينم كار منو مشكل كرده
باز هم از توجهتان ممنونم
sia_2007
چهارشنبه 02 دی 1388, 00:18 صبح
دوست عزیز
رفتم دنبالش ؛ متوجه شدم این مورد تو همه نسخه ها نیست.
از همان روش Trigger استفاده کنید.
ولی حتما روی آن فیلد یک ایندکس معمولی بگذارید؛ تا Trigger شما سریع تر کار کند.
موفق باشی
sia_2007
جمعه 11 دی 1388, 13:30 عصر
دوست عزیز؛ این Feature در نسخه ای که شما دارید پشتیبانی نمیشود؛ حال چه با کد نویسی و چه با Wizard
و اما در مورد کد :
create unique nonclustered index IX_test
on your_table (column_name)
where (column_name is not null) and (column_name <> 0)این کاملا واضحه
این کد رو در Query در Management Studio بنویسید
جای Cloumn Name نام ستون مورد نظرتان
و به جای your-table نام جدولتان را بنویسید.
جواب نداد راه حل همان Trigger است.
محمد سلیم آبادی
جمعه 11 دی 1388, 15:11 عصر
دوست عزیز؛ این Feature در نسخه ای که شما دارید پشتیبانی نمیشود؛ حال چه با کد نویسی و چه با Wizard
.
دوست عزیزم، امکان دارد بگویید که شما از چه نسخه ی SQL Server استفاده می کنین؟ آیا از نرم افزار SQL Server استفاده می کنین؟
دوست عزيز جناب msalim (http://barnamenevis.org/forum/member.php?u=108959) با تشكر از توجهتان در پست شماره 8 يك اسكريپ نوشته بوديد اما نحوه بكارگيري و محل قرار دادن آن را نمي دانم اگه مككنه كمي در اين موارد توضيح بديد ممنون مي شم
دوست عزیزم اگر مشکلتان عدم نداشتن اطلاع از چگونگی استفاده از آن کد بود کافی بود به این موضوع اشاره کنین. همانطوری که در پست قبلی به آن اشاره شد کافیست کد ها را در یک پنجره ی کوئری در برنامه ی SQL Server Managment Studio اجرا کنین (قبل از آن نام database خود را انتخاب کنین) و پس از اجرای آن یک Index روی جدول مورد نظر ساخته خواهد شد.
sia_2007
جمعه 11 دی 1388, 17:06 عصر
؟؟؟
اگر منظورتون نسخه است؛
من این حرف رو از این لحاظ گفتم که من جز SQL 2008
نسخه های Enterprise ؛ Express ؛ Developer و از 2005 نسخه Compact را استفاده نکرده ام.
+ Access
البته این Feature در Express هم بود؛ من گفتم شاید در 2005 نباشد.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.