এসকিউএল সার্ভার সিস্টেম তৈরি হওয়া সীমাবদ্ধতার নামগুলিতে সংঘর্ষ তৈরি করতে পারে?
এটি এসকিউএল সার্ভারের বাধা এবং সংস্করণের ধরণের উপর নির্ভর করে।
CREATE TABLE T1
(
A INT PRIMARY KEY CHECK (A > 0),
B INT DEFAULT -1 REFERENCES T1,
C INT UNIQUE,
CHECK (C > A)
)
SELECT name,
object_id,
CAST(object_id AS binary(4)) as object_id_hex,
CAST(CASE WHEN object_id >= 16000057 THEN object_id -16000057 ELSE object_id +2131483591 END AS BINARY(4)) AS object_id_offset_hex
FROM sys.objects
WHERE parent_object_id = OBJECT_ID('T1')
ORDER BY name;
drop table T1
উদাহরণ ফলাফল 2008
+--------------------------+-----------+---------------+----------------------+
| name | object_id | object_id_hex | object_id_offset_hex |
+--------------------------+-----------+---------------+----------------------+
| CK__T1__1D498357 | 491357015 | 0x1D498357 | 0x1C555F1E |
| CK__T1__A__1A6D16AC | 443356844 | 0x1A6D16AC | 0x1978F273 |
| DF__T1__B__1B613AE5 | 459356901 | 0x1B613AE5 | 0x1A6D16AC |
| FK__T1__B__1C555F1E | 475356958 | 0x1C555F1E | 0x1B613AE5 |
| PK__T1__3BD019AE15A8618F | 379356616 | 0x169C85C8 | 0x15A8618F |
| UQ__T1__3BD019A91884CE3A | 427356787 | 0x1978F273 | 0x1884CE3A |
+--------------------------+-----------+---------------+----------------------+
উদাহরণস্বরূপ ফলাফল 2017
+--------------------------+------------+---------------+----------------------+
| name | object_id | object_id_hex | object_id_offset_hex |
+--------------------------+------------+---------------+----------------------+
| CK__T1__59FA5E80 | 1509580416 | 0x59FA5E80 | 0x59063A47 |
| CK__T1__A__571DF1D5 | 1461580245 | 0x571DF1D5 | 0x5629CD9C |
| DF__T1__B__5812160E | 1477580302 | 0x5812160E | 0x571DF1D5 |
| FK__T1__B__59063A47 | 1493580359 | 0x59063A47 | 0x5812160E |
| PK__T1__3BD019AE0A4A6932 | 1429580131 | 0x5535A963 | 0x5441852A |
| UQ__T1__3BD019A981F522E0 | 1445580188 | 0x5629CD9C | 0x5535A963 |
+--------------------------+------------+---------------+----------------------+
ডিফল্ট সীমাবদ্ধতার জন্য, চেক সীমাবদ্ধতা এবং বিদেশী কী বাধাগুলি স্বয়ংক্রিয়ভাবে উত্পাদিত নামের শেষ 4 বাইট হ'ল সীমাবদ্ধতার আপত্তিজনক একটি হেক্সাডেসিমাল সংস্করণ। objectid
গ্যারান্টিযুক্ত অনন্য হিসাবে নামটিও অনন্য হতে হবে। সাইবাসেও এই ব্যবহারtabname_colname_objectid
অনন্য বাধা এবং প্রাথমিক কী সীমাবদ্ধতার জন্য সায়ব্যাস ব্যবহার করে
tabname_colname_tabindid, যেখানে tabindid হ'ল টেবিল আইডি এবং সূচক ID এর একটি স্ট্রিং সংমিশ্রণ
এটিও স্বতন্ত্রতার গ্যারান্টি দেবে।
এসকিউএল সার্ভার এই স্কিমটি ব্যবহার করে না।
এসকিউএল সার্ভার ২০০৮ এবং 2017 উভয় ক্ষেত্রে এটি সিস্টেম উত্পন্ন নামের শেষে একটি 8 বাইট স্ট্রিং ব্যবহার করে তবে অ্যালগরিদম কীভাবে তার শেষ 4 বাইট তৈরি হয় তা পরিবর্তন হয়েছে।
২০০৮ সালে সর্বশেষ চারটি বাইট একটি স্বাক্ষরিত পূর্ণসংখ্যার কাউন্টারকে উপস্থাপন করে যা সর্বাধিক স্বাক্ষরিত আন্তকে ঘিরে কোনও নেতিবাচক মান দিয়ে অফসেট object_id
করে -16000057
। (এর তাত্পর্যটি 16000057
হ'ল এটি ক্রমবর্ধমান তৈরির মধ্যে প্রয়োগ হওয়া ইনক্রিমেন্টobject_id
)। এটি এখনও স্বতন্ত্রতার গ্যারান্টি দেয়।
২০১২-এর উপরে আমি সীমাবদ্ধ ইন্টের হেক্সাডেসিমাল উপস্থাপনা হিসাবে নামের শেষ ৮ টি অক্ষরকে চিকিত্সা করে বাধাটির অবজেক্ট_আইডি এবং পূর্ণসংখ্যার মধ্যে কোনও প্যাটার্ন দেখতে পাচ্ছি না।
২০১৩ সালে কল স্ট্যাকের ফাংশনের নামগুলি দেখায় যে এটি এখন নাম উত্পন্নকরণ প্রক্রিয়ার অংশ হিসাবে একটি জিইউডি তৈরি করে (২০০৮-এ আমি এর কোনও উল্লেখ পাই না MDConstraintNameGenerator
)। আমার ধারণা এটি এলোমেলোভাবে কিছু উত্স প্রদান করে। স্পষ্টতই এটি জিআইডি থেকে পুরো 16 বাইট ব্যবহার করছে না যে 4 বাইট যা সীমাবদ্ধতার মধ্যে পরিবর্তন করে।
আমি মনে করি যে নতুন অ্যালগরিদমটি দক্ষতার কারণে আপনার নিজের মতো চরম ক্ষেত্রে সংঘর্ষের সম্ভাবনা বাড়ার ব্যয় করে করা হয়েছিল।
এটি বেশ একটি প্যাথলজিকাল কেস কারণ এটি পিকে টেবিলের নাম উপসর্গ এবং কলামের নাম প্রয়োজন (ইনফার হিসাবে এটি চূড়ান্ত 8 এর আগের 8 টি অক্ষরকে প্রভাবিত করে) এটি কয়েক হাজার টেবিলের সম্ভাব্য হওয়ার আগেই অভিন্ন হতে পারে তবে বেশ পুনরুত্পাদন করা যেতে পারে সহজেই নীচের সাথে।
CREATE OR ALTER PROC #P
AS
SET NOCOUNT ON;
DECLARE @I INT = 0;
WHILE 1 = 1
BEGIN
EXEC ('CREATE TABLE abcdefghijklmnopqrstuvwxyz' + @I + '(C INT PRIMARY KEY)');
SET @I +=1;
END
GO
EXEC #P
নতুন তৈরি করা ডাটাবেসের বিরুদ্ধে এসকিউএল সার্ভার 2017 তে চালানো একটি উদাহরণ মাত্র এক মিনিটের মধ্যে ব্যর্থ হয়েছে (50,931 টেবিল তৈরি হওয়ার পরে)
এমএসজি 2714, স্তর 16, রাজ্য 30, লাইন 15 ইতিমধ্যে ডাটাবেসে 'PK__abcdefgh__3BD019A8175067CE' নামে একটি অবজেক্ট রয়েছে। এমএসজি 1750, স্তর 16, রাজ্য 1, লাইন 15 সীমাবদ্ধতা বা সূচক তৈরি করতে পারেনি। পূর্ববর্তী ত্রুটিগুলি দেখুন।