2010-12-15 9 views
24

mam ten typ zdefiniowany przez użytkownika, które chciałbym, aby dodać klucz podstawowy lub indeks:Jak dodać indeks lub klucz podstawowy do typu tabeli zdefiniowanego przez użytkownika w SQL Server?

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 

I w zasadzie chciałby albo dodać klucz podstawowy lub indeksu klastrowego. Próbowałem tego, ale pojawia się błąd "Nie można znaleźć obiektu" dbo.DistCritGroupData ", ponieważ nie istnieje lub nie masz uprawnień.

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 
    )   
); 

widzę w Eksploratorze obiektów w moim zdefiniowanego przez użytkownika typu tabeli, które istnieją sekcje dla „Kolumny”, „Keys”, „ograniczenia” i „indeksów”. Pytanie brzmi: jak mogę dodać klucz lub indeks?

Odpowiedz

38

Dlaczego nie to?

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  
); 

lub

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 nie pozwala na nazwanie contraints. Podobnie jak zmienne tabel.

3

Można określić typ tak:

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

nigdy nie dowiedział się, dlaczego ludzie potrzebują bazy danych nazw kluczy podstawowych. Powinny zostać nazwane Podstawowym kluczem tabeli xyz.

+1

Czy "Podstawowy klucz tabeli xyz" jest prawidłowym identyfikatorem? Potrzebna jest jakaś nazwa dla sys.objects .. – gbn

+0

@ gbn Jest to absolutnie wyjątkowe i możesz ocenić unikatową wygenerowaną nazwę z tabel systemowych, jeśli musisz. –

+2

Potrzebny jest nazwany klucz lub ograniczenie, gdy pracujesz z kontrolą źródła. Wymienione klucze lub ograniczenia są bardzo pomocne. – eghetto

15

Odpowiedzi @bernd_K i @ gbn działają, jeśli jest to pojedyncza kolumna PK. Dla wielu kolumny, byłoby:

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) 
); 

W skrócie, można mieć PKs i niepowtarzalny table constraints, ale nie można ich nazwać. Ten rodzaj ma sens, ponieważ zamierzasz tworzyć wiele obiektów tego samego typu, a jedyny czas, w którym będziesz chciał pracować z tymi ograniczeniami, byłby zmianą całego typu tabeli.

Nie można również definiować indeksów, ponieważ są one głównie artefaktem związanym z fizycznym przechowywaniem.

Powiązane problemy