2010-12-15 5 views
24

मेरे पास यह उपयोगकर्ता परिभाषित प्रकार है कि मैं प्राथमिक कुंजी या अनुक्रमणिका को जोड़ना चाहता हूं:SQL सर्वर में किसी उपयोगकर्ता द्वारा परिभाषित तालिका प्रकार के लिए कोई अनुक्रमणिका या प्राथमिक कुंजी कैसे जोड़ें?

IF NOT EXISTS (
    SELECT * 
    FROM sys.types st 
    JOIN sys.schemas ss 
    ON st.schema_id = ss.schema_id 
    WHERE st.name = N'DistCritGroupData' 
    AND ss.name = N'dbo') 
BEGIN 

    CREATE TYPE [dbo].[DistCritGroupData] AS TABLE 
    (
    [DistCritTypeId] [int] NOT NULL, 
    [ItemAction] [int] NOT NULL,   
    [ObjectId] [int] NOT NULL, 
    [OperatorType] [int] NOT NULL  
); 

END; 
GO 

मैं मूल रूप से प्राथमिक कुंजी या क्लस्टर्ड इंडेक्स जोड़ना चाहता हूं। मैंने कोशिश की लेकिन मुझे त्रुटि मिली 'ऑब्जेक्ट नहीं मिल सका "dbo.DistCritGroupData" क्योंकि यह अस्तित्व में नहीं है या आपके पास अनुमति नहीं है।

 CREATE TYPE [dbo].[DistCritGroupData] AS TABLE 
    (
    [DistCritTypeId] [int] NOT NULL, 
    [ItemAction] [int] NOT NULL,   
    [ObjectId] [int] NOT NULL, 
    [OperatorType] [int] NOT NULL, 
    CONSTRAINT [DistCritGroupData0] PRIMARY KEY CLUSTERED 
    (
     [DistCritTypeId] ASC 
    )   
); 

मैं अपने उपयोगकर्ता द्वारा परिभाषित तालिका प्रकार पर ऑब्जेक्ट एक्सप्लोरर में देखता हूं कि "कॉलम", "कुंजी", "बाधाएं" और "इंडेक्स" के लिए अनुभाग हैं। सवाल यह है कि, मैं एक कुंजी या सूचकांक कैसे जोड़ूं?

उत्तर

38

ऐसा क्यों नहीं?

CREATE TYPE [dbo].[DistCritGroupData] AS TABLE 
    (
    [DistCritTypeId] [int] NOT NULL PRIMARY KEY CLUSTERED, 
    [ItemAction] [int] NOT NULL,   
    [ObjectId] [int] NOT NULL, 
    [OperatorType] [int] NOT NULL  
); 

या

CREATE TYPE [dbo].[DistCritGroupData] AS TABLE 
    (
    [DistCritTypeId] [int] NOT NULL, 
    [ItemAction] [int] NOT NULL,   
    [ObjectId] [int] NOT NULL, 
    [OperatorType] [int] NOT NULL, 
    PRIMARY KEY CLUSTERED ([DistCritTypeId] ASC)   
); 

CREATE TYPE contraints के नामकरण की अनुमति नहीं है। टेबल चर की तरह।

3

आप इस तरह अपने प्रकार निर्दिष्ट कर सकते हैं:

CREATE TYPE [dbo].[DistCritGroupData] AS TABLE 
    (
    [DistCritTypeId] [int] NOT NULL primary key, 
    [ItemAction] [int] NOT NULL,   
    [ObjectId] [int] NOT NULL, 
    [OperatorType] [int] NOT NULL 
); 

मैं कभी नहीं सीखा क्यों डेटाबेस लोग प्राथमिक कुंजी के लिए नामों की जरूरत है। उन्हें टेबल xyz की प्राथमिक कुंजी कहा जाना चाहिए।

+1

"तालिका xyz की प्राथमिक कुंजी" एक वैध पहचानकर्ता है? इसे sys.objects के लिए कुछ नाम चाहिए .. – gbn

+0

@gbn यह बिल्कुल अनूठा है और यदि आपको जरूरी है, तो आप सिस्टम टेबल से अद्वितीय जेनरेट किए गए नाम का मूल्यांकन कर सकते हैं। –

+2

जब आप स्रोत नियंत्रण के साथ काम कर रहे हों तो आपको नामित कुंजी या बाधा की आवश्यकता है। फिर नाम कुंजी या बाधा बहुत उपयोगी हैं। – eghetto

15

@bernd_K और @ gbn के उत्तर काम करते हैं यदि यह एक कॉलम पीके है। बहु स्तंभ के लिए, यह होगा:

CREATE TYPE [dbo].[DistCritGroupData] AS TABLE 
    (
    [DistCritTypeId] [int] NOT NULL, 
    [ItemAction] [int] NOT NULL,   
    [ObjectId] [int] NOT NULL, 
    [OperatorType] [int] NOT NULL, 
    PRIMARY KEY (ColumnA,ColumnB) 
); 

संक्षेप में, आप पीकेएस और अद्वितीय table constraints हो सकता है, लेकिन आप उन्हें नाम नहीं कर सकते हैं। इस प्रकार का अर्थ समझ में आता है, क्योंकि आप एक ही प्रकार की कई ऑब्जेक्ट्स बनाने जा रहे हैं, और एकमात्र समय जब आप इन बाधाओं के साथ काम करना चाहते हैं तो पूरे टेबल प्रकार में बदलाव होगा।

आप इंडेक्स को भी परिभाषित नहीं कर सकते हैं, क्योंकि ये मुख्य रूप से भौतिक भंडारण के आसपास एक आर्टिफैक्ट हैं।

संबंधित मुद्दे