SQL सर्वर तालिका के लिए IDENTITY VALUE को भौतिक रूप से कहाँ संग्रहीत करता है?


12

मुझे उम्मीद है कि कोई मुझे इस पर सही दिशा में इशारा कर सकता है। यहाँ मेरा काम अब तक है।

SELECT * FROM sys.identity_columnsएक सिस्टम दृश्य है जो "last_value" देता है, लेकिन उस दृश्य के लिए परिभाषा एक आंतरिक फ़ंक्शन का उपयोग करती है IdentityProperty(colName, 'LastValue')- इसलिए यह एक मृत अंत है (इसे वहां सिस्टम तालिका से नहीं खींच रहा है)।

इंटरनेट पर हर जगह (मैंने देखा है) DBCC IDENT_...मूल्य को उजागर करने के लिए कमांड का उपयोग करने का सुझाव देता है लेकिन फिर भी मुझे अंधेरे में छोड़ देता है जहां यह वास्तव में संग्रहीत है।

इसलिए, मैं DBCC PAGE(TestDB,1,1325,3)अपने परीक्षण हार्नेस डीबी के खिलाफ और RESEED10 और 12 के बीच के मूल्यों को फिर से शुरू करने के लिए कमांड का उपयोग करके अलग-अलग पृष्ठों की खोज करने के लिए पहुंचा।

ऐसा करने में, मैंने हेक्स मूल्यों पर ध्यान दिया IAM: Header, IAM: Single Page Allocationsऔर IAM: Extent Alloc Status Slot 1सब बदल गया। (और एहसास हुआ कि वे समय-समय पर bUse1 मूल्य के साथ-साथ बदलते हैं जो कि अपने आप में बहुत अधिक बदल जाते हैं)।

इसलिए एक और डेड-एंड और मैं विचारों से बाहर हूं। मैं और कहां खोज सकता हूं?

मैं SQL सर्वर 2014 चला रहा हूं। मेरे पास इंटर्नल नॉलेज के लिए एक इंसेटिव प्यास है और अभी तक इसके बारे में कुछ भी मायावी नहीं है। यह मेरा ध्यान आकर्षित कर रहा है क्योंकि सिद्धांत रूप में, यह (एक निरपेक्ष मूल्य) कहीं संग्रहीत है और (यकीनन) स्थानीय होना चाहिए। आंतरिक रूप से संग्रहीत डेटा / मेटा डेटा के स्थानों का पता लगाने की मेरी तलाश में, यह विशेष मूल्य मुझे विशेष रूप से मायावी के रूप में प्रभावित करता है। मैं अनुमान लगा रहा हूं / उम्मीद कर रहा हूं कि कोई व्यक्ति मेरे साथ आएगा और मुझे बताएगा, आप इसे प्राप्त कर सकते हैं DBCC PAGEलेकिन मैं गलत जगह देख रहा था।

जवाबों:


8

यदि आप DAC ( डेडिकेटेड एडमिनिस्ट्रेटर कंसोल ) तक पहुँच सकते हैं , तो आप कॉलम में INTदेख कर कॉलम के लिए, पहचान कॉलम के मूल्य का निरीक्षण कर सकते हैं ।idtvalsys.syscolpars

यहां एक संबंधित प्रश्न पर रूही गैविश द्वारा इस बहुत उपयोगी उत्तर के माध्यम से मुझे उस तालिका में निर्देशित करने के लिए मार्टिन स्मिथ का धन्यवाद ।

उदाहरण के लिए, निम्न अस्थायी तालिका लें:

USE tempdb;

CREATE TABLE #d
(
    ID INT NOT NULL IDENTITY(1,1)
);

TRUNCATE TABLE #d;

DBCC CHECKIDENT ('#d',RESEED, 2147483635);

INSERT INTO #d DEFAULT VALUES;

आइए देखें कि तालिका में क्या है:

SELECT *
FROM #d;
+------------+
| ID         |
+------------+
| 2147483635 |
+------------+

इस कोड द्वारा पहचान मूल्य का निरीक्षण किया जा सकता है:

DECLARE @idtval VARBINARY(64);

SELECT @idtval = scp.idtval
FROM sys.syscolpars scp
    INNER JOIN sys.objects o ON scp.id = o.object_id
WHERE o.name LIKE '#d____%'

DECLARE @LittleEndian NVARCHAR(10);
SET @LittleEndian = LEFT(sys.fn_varbintohexstr(@idtval), 10);
SELECT @LittleEndian;
DECLARE @BigEndian NVARCHAR(10) = '0x';
DECLARE @Loop INT = 0;
WHILE @Loop < 4
BEGIN
  SET @BigEndian = @BigEndian + SUBSTRING(@LittleEndian, ((4 - @Loop) * 2) + 1, 2);
  SET @Loop += 1;
END
SELECT CurrentIdentityValue = CONVERT(INT, 
    CONVERT(VARBINARY(32), @BigEndian, 1), 2);
+----------------------+
| CurrentIdentityValue |
+----------------------+
|                      |
| 2147483635           |
+----------------------+

के लिए BIGINTपहचान कॉलम, हम इस तरह के रूप में इस्तेमाल किया कोड कुछ चर, के आकार का विस्तार करने की जरूरत है:

CREATE TABLE #dBig
(
    ID BIGINT NOT NULL IDENTITY(1,1)
);

TRUNCATE TABLE #dBig;

DBCC CHECKIDENT ('#dBig',RESEED, 9223372036854775704);

INSERT INTO #dBig DEFAULT VALUES;

SELECT *
FROM #dBig;


DECLARE @idtval VARBINARY(64);

SELECT @idtval = scp.idtval
FROM sys.syscolpars scp
    INNER JOIN sys.objects o ON scp.id = o.object_id
WHERE o.name LIKE '#dBig____%'

DECLARE @LittleEndian NVARCHAR(18);
SET @LittleEndian = LEFT(sys.fn_varbintohexstr(@idtval), 18);
DECLARE @BigEndian NVARCHAR(18) = '0x';
DECLARE @Loop INT = 0;
WHILE @Loop < 8
BEGIN
  SET @BigEndian = @BigEndian + SUBSTRING(@LittleEndian, ((8 - @Loop) * 2) + 1, 2);
  SET @Loop += 1;
END
SELECT CurrentIdentityValue = CONVERT(BIGINT, 
    CONVERT(VARBINARY(32), @BigEndian, 1), 2);

के लिए परिणाम BIGINT:

+----------------------+
| CurrentIdentityValue |
+----------------------+
|                      |
| 9223372036854775704  |
+----------------------+
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.