मैं AdventureWorks2012 डेटाबेस में चारों ओर खुदाई कर रहा हूं और कई तालिकाओं में रो_GUID का उपयोग करता हूं।
मेरे प्रश्न के 2 भाग हैं:
मुझे एक Row_GUID कॉलम कब शामिल करना चाहिए?
Row_GUID कॉलम के उपयोग और लाभ क्या हैं?
मैं AdventureWorks2012 डेटाबेस में चारों ओर खुदाई कर रहा हूं और कई तालिकाओं में रो_GUID का उपयोग करता हूं।
मेरे प्रश्न के 2 भाग हैं:
मुझे एक Row_GUID कॉलम कब शामिल करना चाहिए?
Row_GUID कॉलम के उपयोग और लाभ क्या हैं?
जवाबों:
ROWGUIDCOL
मुख्य रूप से MERGE प्रतिकृति के लिए उपयोग किया जाता है , और इसके लिए भी आवश्यक हैFILESTREAM
, लेकिन इसका उपयोग किसी भी परिदृश्य में किया जा सकता है जहां आप प्राथमिक कुंजी से अलग एक अपरिवर्तनीय स्तंभ चाहते हैं (उदाहरण के लिए जहां प्राथमिक कुंजी मान बदल सकता है, लेकिन आप अभी भी बनना चाहते हैं यह बताने में सक्षम है कि परिवर्तन के पहले और बाद में कौन सी पंक्ति थी)।
USE tempdb;
GO
CREATE TABLE dbo.example
(
name sysname PRIMARY KEY,
rowguid uniqueidentifier NOT NULL DEFAULT NEWID() ROWGUIDCOL
);
INSERT dbo.example(name) VALUES(N'bob'),(N'frank');
SELECT * FROM dbo.example;
UPDATE dbo.example SET name = N'pat' WHERE name = N'bob';
UPDATE dbo.example SET name = N'bob' WHERE name = N'frank';
SELECT * FROM dbo.example;
DROP TABLE dbo.example;
अब, अगर प्रतिकृति, या आपके आवेदन, या आपके पास क्या ध्यान है, तो यह ध्यान देगा:
देखें यहाँ , यहाँ , और "स्नैपशॉट विचार" अनुभाग यहाँ अधिक जानकारी के लिए।
एक कॉलम को चिह्नित करने के रूप में ROWGUIDCOL
इसे $ROWGUID
प्रश्नों में संदर्भित किया जा सकता है । इससे प्रश्नों को अधिक सामान्य बनाने की अनुमति मिलती है, क्योंकि आपको प्रत्येक तालिका को देखने की आवश्यकता नहीं होगी, "अद्वितीय" कॉलम क्या है (यह प्रतिकृति और फ़ाइलस्ट्रीम जैसी सुविधाओं के लिए काफी उपयोगी है, जैसा कि @Aaron और @Martin द्वारा क्रमशः उल्लेख किया गया है। )। आपके पास ऐप लेयर में या डायनेमिक SQL में भी एक क्वेरी निर्मित हो सकती है, जो कुछ ऐसा करती है SELECT $ROWGUID AS [ID] FROM {table_name}
और बस तालिकाओं की सूची पर पुनरावृति करती है।
बस ध्यान रखें कि ROWGUIDCOL
पदनाम अद्वितीयता को लागू नहीं करता है । आपको अभी भी एक प्राथमिक कुंजी, एक अद्वितीय सूचकांक या एक अद्वितीय बाधा के माध्यम से इसे लागू करने की आवश्यकता होगी। न ही यह विकल्प लागू करता है कि स्तंभ अपरिवर्तनीय है। इसके लिए आपको उस स्तंभ पर AFTER UPDATE
ट्रिगर या स्तंभ-स्तरीय अनुमतियों की आवश्यकता होगी DENY UPDATE
।
उदाहरण के लिए:
SET NOCOUNT ON;
CREATE TABLE #RowGuidColTest
(
ID UNIQUEIDENTIFIER NOT NULL DEFAULT (NEWID()) ROWGUIDCOL,
SomeValue INT
);
INSERT INTO #RowGuidColTest (SomeValue) VALUES (12), (14), (1231);
DECLARE @Search UNIQUEIDENTIFIER;
SELECT TOP (1) @Search = $ROWGUID
FROM #RowGuidColTest;
SELECT @Search AS [@Search]
SELECT *, $ROWGUID AS [$ROWGUID]
FROM #RowGuidColTest;
SELECT *
FROM #RowGuidColTest
WHERE $ROWGUID = @Search;
-- No enforced uniqueness without a PK, Unique Index, or Unique Constraint.
UPDATE tmp
SET $ROWGUID = @Search
FROM #RowGuidColTest tmp
SELECT *
FROM #RowGuidColTest
WHERE $ROWGUID = @Search;
कुछ इसी तरह लौटाता है:
@Search
E7166D18-5003-4D20-8983-E2402472CF82
ID SomeValue $ROWGUID
E7166D18-5003-4D20-8983-E2402472CF82 12 E7166D18-5003-4D20-8983-E2402472CF82
44FD48A4-AF38-41BF-AE4E-8A12D26B5B57 14 44FD48A4-AF38-41BF-AE4E-8A12D26B5B57
2D50C5C7-1E43-4ADA-A03B-ED202FC88D20 1231 2D50C5C7-1E43-4ADA-A03B-ED202FC88D20
ID SomeValue
E7166D18-5003-4D20-8983-E2402472CF82 12
ID SomeValue
E7166D18-5003-4D20-8983-E2402472CF82 12
E7166D18-5003-4D20-8983-E2402472CF82 14
E7166D18-5003-4D20-8983-E2402472CF82 1231
इसी तरह, कोई उन $IDENTITY
टेबल के लिए उपयोग कर सकता है जिनके पास एक IDENTITY
कॉलम है।