PDA

View Full Version : کد رهگیری یا شماره پیگیری در SQL Server 2003



anahita_s
یک شنبه 21 مرداد 1386, 16:27 عصر
سلام
من و دوستم یک پایگاه داده طراحی کردیم که دراین پایگاه می خواهیم یک کد رهگیری یا شماره پیگیری در حدود پنج یا شش رقمی به کاربر ارائه کنیم که تکراری نباشد و به صورت ترتیبی نیز نباشد، در واقع این کدها در سایتهای مختلف برای پیگیری به کاربر ارائه می شود، لطفا ما را راهنمایی نمایید.
با تشکر

Hamid.Kad
یک شنبه 21 مرداد 1386, 18:32 عصر
شما می تونید اعداد مورد نظر روی توی یه Table قرار بدید همراه با یه فیلد flag که مشخص میکنه عدد این رکورد قبلاً انتخاب شده یا نه.
برای تولید عدد یه query بزنید روی جدول where flag =0
و با یکی از مکانیزمهای انتخاب اعداد تصادفی(مثلاً Rand یا توابع مربوط به خود زبان برنامه نویسی) یکی از رکوردهای نتیجه رو انتخاب کنید

AminSobati
یک شنبه 21 مرداد 1386, 22:11 عصر
دوست عزیزم،
روشهای متنوعی برای این کار میتونه وجود داشته باشه، مثلا:


select left(newid(),3)+right(newid(),3)

Hamid.Kad
دوشنبه 22 مرداد 1386, 10:16 صبح
جناب ثباتی یعنی newid() هیچ وقت 2 مقدار ایجاد نمیکنه که مقدار سمت چپ یا راستشون با هم برابر باشند ؟ من فکر می کردم که فقط کل مقدار نتیجه Unique هست.

AminSobati
دوشنبه 22 مرداد 1386, 10:43 صبح
حمید جان از نظر علم آمار و احتمالات حتی خود newid بصورت کاملش هم ممکنه تکراری بشه. روشی که من نوشتم یک مثال بود ولی کار راه اندازه! فرضا در SP که میخواد Insert انجام بده، میشه TRY CATCH استفاده کرد که اگر PK تکراری بود، با یک GoTo به بالاتر، مجددا id جدید شش کاراکتری رو تولید کنه. ولی اگر id رو مثلا هشت کاراکتری در نظر بگیریم، باز احتمال تکراری شدنش بسیار کاهش پیدا میکنه

Saeed.Elmi
دوشنبه 22 مرداد 1386, 11:18 صبح
جناب آقای ثباتی تابع NewID یک GUID تولید می کند که یکتا بودنش تضمین شده است.

در BOL:
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/udb9/html/ac5fd2da-1e3d-4266-9e43-5fdc1858731c.htm
و اگر من اشتباه می کنم لطفا راهنمایی ام کنید.

AminSobati
جمعه 26 مرداد 1386, 23:09 عصر
اینکه GUID "منطقا" یونیک باشه با اینکه "عملا" یونیک باشه دو موضوع متفاوته. به هر حال GUID از تعدادی حرف و عدد تشکیل شده که میتونن جایگشتهایی رو داشته باشند. تعداد جایگشتها بسیار زیاده و در عمل تکراری شدن اونها منتفی هست، اما از نظر علمی میتونه تکرار داشته باشه.

Hamid.Kad
شنبه 27 مرداد 1386, 07:15 صبح
ضمن احترام به فرمایش شما، بنظرم توی این مورد GUID منطقاً و عملاً باید یونیک باشند.
چون شما طوری مقصودتون رو "عملی" می کنید که "منطق" مورد نظرتون رو برآورده کنه و اگه غیر از این باشه حتماً یه جایی اشکال وجود داره.
مایکروسافت تاکید میکنه که یونیک بودن GUID تضمین شده است.

اما از نظر علمی میتونه تکرار داشته باشه.
بدون در نظر گرفتن شرایط، بله. ولی اگه یه روزی همچین اتفاقی افتاد که کسی مثلاً تعداد رکوردهاش از 32^16~ بیشتر شد MSSQL دیگه به اون اجازه data entry نمیده تا اینکه بخواد یه GUID تکراری تولید کنه.

AminSobati
شنبه 27 مرداد 1386, 09:07 صبح
ببین پسرم، شما فرض کنین GUID رو فقط با یک کاراکتر تولید میکنید. پس با داشتن 26 حرف انگلیسی و 10 عدد از 0 تا 9 میشه گفت این GUID فقط 36 حالت میتونه داشته باشه. حالا اگر GUID با دو کاراکتر تولید بشه، یعنی 36x36 حالت امکان وجود داره. با سه کاراکتر میشه 36x36x36 و با چهار کاراکتر میشه ......
با افزایش تعداد کاراکترهای GUID، فقط حالتهای ممکن رو افزایش میدین. پس در این که تعداد GUIDها محدوده، منطقا شکی نیست. ولی این محدودیت Range بسیار بزرگی هست و عملا رو به بینهایت میل میکنه.

Hamid.Kad
شنبه 27 مرداد 1386, 09:24 صبح
البته تا اونجا که من می دونم GUID از 32 رقم هگزا دسیمال تشکیل شده که با احتساب 16 حالت برای هر رقم چیزی حدود 16 به توان 32 حالت مختلف (منهای تعداد حالات رزرو شده) خواهیم داشت.

اینکه GUID "منطقا" یونیک باشه با اینکه "عملا" یونیک باشه دو موضوع متفاوته
برداشت حقیر از فرمایش شما اینه که بنظر شما عملاً یونیک نیست، چون منطقاً که باید باشه و عرض بنده هم اینه که در عمل هم یونیک بودنش تضمین شده است.

AminSobati
شنبه 27 مرداد 1386, 11:09 صبح
درسته، GUID به اندازه 32 کاراکتر طول داره، ولی هر کاراکتر میتونه 36 حالت باشه و این میشه 36 به توان 32.

برداشت حقیر از فرمایش شما اینه که بنظر شما عملاً یونیک نیست
همونطور که عرض شد، تعداد حالتها منطقا محدود هستند، اما چون Range وسیع هستش، عملا تکرار پیش نمیاد. در wikipedia به این موضوع اشاره کرده GUID برای یک موضوع یا هدف خاص یونیک بودنش تضمین میشه. یعنی یک GUID که برای یک COM Object تولید میشه، ممکنه با GUID که در Replication برای یک رکورد تولید شده، یکسان باشه.

Hamid.Kad
شنبه 27 مرداد 1386, 11:28 صبح
ولی هر کاراکتر میتونه 36 حالت باشه و این میشه 36 به توان 32

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, in which each x is a hexadecimal digit in the range 0-9 or a-f). For example, 6F9619FF-8B86-D011-B42D-00C04FC964FF is a valid uniqueidentifier value.

این توضیحیه که توی Books online برای uniqueidentifier اومده
یعنی هر کارکتر 16 حالت بیشتر نمی تونه داشته باشه که کل تعداد حالات برابر 16 به توان 32 میشه.


یعنی یک GUID که برای یک COM Object تولید میشه، ممکنه با GUID که در Replication برای یک رکورد تولید شده، یکسان باشه

جناب ثباتی، موضوع بحث ما درباره Sql Server بود و توی اونجاست که یونیک بودن مهمه.
اگه Guid Com Object با Guid Record فرضاً برابر هم باشند مشکل خاصی پیش نمیاد.

AminSobati
شنبه 27 مرداد 1386, 20:33 عصر
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, in which each x is a hexadecimal digit in the range 0-9 or a-f). For example, 6F9619FF-8B86-D011-B42D-00C04FC964FF is a valid uniqueidentifier value.

ممنون حمید جان نکته مفیدی بود



اگه Guid Com Object با Guid Record فرضاً برابر هم باشند مشکل خاصی پیش نمیاد.

عرض بنده این بود که حتی در SQL Server هم "عملا" مشکل پیش نمیاد!

Hamid.Kad
شنبه 27 مرداد 1386, 20:46 عصر
فرض کنیم بخواهیم آخرین تغییرات روی رکوردها رو log کنیم.چیزی که وقتی امنیت مطرح میشیه خیلی مهمه. با استفاده از فیلد uniqueIdentifier این کار براحتی در یک جدول امکان پذبره(هر چند راههای دیگه ای هم هست که بار بیشتری رو به سیستم تحمیل میکنه)
حالا اگه قرار باشه که این فیلد، تکراری بشه ممکنه بخشی از اطلاعات روی هم overwrite بشن یعنی بخشی از اطلاعات از بین میرن!