2008-09-26 5 views
86

Próbuję sprawdzić, czy istnieje domyślne ograniczenie. Nie chcę używać tabeli sysobjects, ale bardziej standardowe INFORMATION_SCHEMA.Jak znaleźć domyślne ograniczenie za pomocą INFORMATION_SCHEMA?

Używałem tego do sprawdzania wcześniej ograniczeń tabel i podstawowych kluczy, ale nie widzę nigdzie żadnych ograniczeń domyślnych.

Nie ma ich tam? (Używam MS SQL Server 2000).

EDYCJA: Szukam uzyskać nazwę ograniczenia.

Odpowiedz

86

Jak rozumiem, ograniczenia wartości domyślne nie są częścią Standard ISO, więc nie pojawiają się w INFORMATION_SCHEMA. INFORMATION_SCHEMA wydaje się najlepszym wyborem dla tego rodzaju zadania, ponieważ jest to platforma wieloplatformowa, ale jeśli informacja nie jest dostępna, należy użyć widoków katalogu obiektów (sys. *) Zamiast widoków tabel systemowych, które są nieaktualne w SQL Server 2005 i później.

Poniżej jest prawie taka sama jak odpowiedź @ user186476. Zwraca nazwę ograniczenia wartości domyślnej dla danej kolumny. (W przypadku użytkowników innych niż SQL Server potrzebna jest nazwa domyślna w celu jej upuszczenia, a jeśli nie nazwiesz domyślnego ograniczenia samodzielnie, SQL Server tworzy szaloną nazwę, taką jak "DF_TableN_Colum_95AFE4B5".Aby łatwiej zmienić schemat w przyszłości, zawsze wyraźnie wymienić swoje ograniczenia!)

-- returns name of a column's default value constraint 
SELECT 
    default_constraints.name 
FROM 
    sys.all_columns 

     INNER JOIN 
    sys.tables 
     ON all_columns.object_id = tables.object_id 

     INNER JOIN 
    sys.schemas 
     ON tables.schema_id = schemas.schema_id 

     INNER JOIN 
    sys.default_constraints 
     ON all_columns.default_object_id = default_constraints.object_id 

WHERE 
     schemas.name = 'dbo' 
    AND tables.name = 'tablename' 
    AND all_columns.name = 'columnname' 
+1

Uwaga: możliwe jest posiadanie tej samej nazwy tabeli w różnych schematach, więc powinieneś także dołączyć do tabeli sys.schemas. –

+1

@DanielJamesBryars sys.schemas zostały teraz dodane do zapytania. –

+0

Proszę zobaczyć [moja odpowiedź] (http://stackoverflow.com/a/32750390/57611), która jest krótka i słodka, działa we wszystkich wersjach SQL Server, nie ma żadnych tabel 'sys' i jest łatwa do zapamiętania . – ErikE

2

Czy kolumna COLUMN_DEFAULT INFORMATION_SCHEMA.COLUMNS jest tym, czego szukasz?

+0

Tak i nie, mówi mi, że jest domyślne i co to jest, ale potrzebuję również nazwy ograniczenia. – WildJoe

+1

Należy również pamiętać, że jeśli loginu SQL środowiska wykonawczego nie jest właścicielem schematu dbo, wartości NULL można znaleźć tylko w kolumnie COLUMN_DEFAULT. –

0

Nie sądzę, że jest w INFORMATION_SCHEMA - prawdopodobnie będziesz musiał użyć sysobjects lub powiązanych przestarzałych tabel/widoków.

Można by pomyśleć, że istnieje typ tego w INFORMATION_SCHEMA.TABLE_CONSTRAINTS, ale go nie widzę.

0

Prawdopodobnie dlatego, że w niektórych innych SQL DBMS "ograniczenie domyślne" nie jest tak naprawdę ograniczeniem, nie znajdziesz jego nazwy w "INFORMATION_SCHEMA.TABLE_CONSTRAINTS", więc najlepszym wyborem jest "INFORMATION_SCHEMA.COLUMNS", tak jak inni wspomniałem już.

(SQLServer-ignorantem tutaj)

Jedynym powodem mogę myśleć, kiedy trzeba wiedzieć „default ograniczenie” ma na imię jeśli SQLServer nie obsługuje polecenia "ALTER TABLE xxx ALTER COLUMN yyy SET DEFAULT...". Ale jesteś już w niestandardowej strefie i musisz użyć specyficznych dla danego produktu sposobów, aby uzyskać to, czego potrzebujesz.

33

Wygląda na to, że nie ma domyślnych nazw ograniczeń w widokach Information_Schema.

użycie SELECT * FROM sysobjects WHERE xtype = 'D' AND name = @name znaleźć domyślne ograniczenie według nazwy

+2

+1 dla prostszego zapytania –

+0

właśnie tego potrzebowałem. Dzięki – drdwilcox

+0

Bezpośrednio odpowiada na pytanie lepiej niż późniejsze alternatywy (SQL 2000 i zapytanie przez nazwę ograniczenia). –

34

można użyć następujących czynności, aby zawęzić wyniki jeszcze bardziej poprzez podanie nazwy tabeli i nazwę kolumny, która ograniczenie domyślne koreluje:

select * from sysobjects o 
inner join syscolumns c 
on o.id = c.cdefault 
inner join sysobjects t 
on c.id = t.id 
where o.xtype = 'D' 
and c.name = 'Column_Name' 
and t.name = 'Table_Name' 
+0

Szukam tego prostego zapytania od kilku godzin. Thannnnnkkk youuuu! – Samuel

+0

Powinieneś mieć o.xtype = "D" do pracy, a baza danych nie jest wrażliwa na wielkość liter. – IvanH

+0

@IvanH Dobry punkt! –

0

Jak o użyciu kombinacji CHECK_CONSTRAINTS i CONSTRAINT_COLUMN_USAGE:

select columns.table_name,columns.column_name,columns.column_default,checks.constraint_name 
      from information_schema.columns columns 
      inner join information_schema.constraint_column_usage usage on 
        columns.column_name = usage.column_name and columns.table_name = usage.table_name 
      inner join information_schema.check_constraints checks on usage.constraint_name = checks.constraint_name 
    where columns.column_default is not null 
+0

CONSTRAINT_COLUMN_USAGE nie zawiera żadnych informacji o ograniczeniach domyślnych. –

2
select c.name, col.name from sys.default_constraints c 
    inner join sys.columns col on col.default_object_id = c.object_id 
    inner join sys.objects o on o.object_id = c.parent_object_id 
    inner join sys.schemas s on s.schema_id = o.schema_id 
where s.name = @SchemaName and o.name = @TableName and col.name = @ColumnName 
+1

Trochę więcej białych znaków byłoby miłych, ale robi to, co pierwotny plakat zapytał przy użyciu widoków katalogu obiektów (sys. *), Które są zalecane przez firmę Microsoft w porównaniu z widokami tabel systemu kompatybilności wstecznej. –

11

Skrypt poniżej lista wszystkich ograniczeń domyślne i wartości domyślnych dla tabel użytkownika w bazie danych, w której jest prowadzony będących:

SELECT 
     b.name AS TABLE_NAME, 
     d.name AS COLUMN_NAME, 
     a.name AS CONSTRAINT_NAME, 
     c.text AS DEFAULT_VALUE 
FROM sys.sysobjects a INNER JOIN 
     (SELECT name, id 
     FROM sys.sysobjects 
     WHERE xtype = 'U') b on (a.parent_obj = b.id) 
         INNER JOIN sys.syscomments c ON (a.id = c.id) 
         INNER JOIN sys.syscolumns d ON (d.cdefault = a.id)           
WHERE a.xtype = 'D'   
ORDER BY b.name, a.name 
2

Jeśli chcesz uzyskać ograniczenie przez nazwy kolumn lub tabel, lub chcesz uzyskać wszystkie ograniczenia w bazę danych, spójrz na inne odpowiedzi. Jednakże, jeśli po prostu szukasz dokładnie tego, o co pyta, a mianowicie, do "sprawdź, czy istnieje ograniczenie domyślne ... pod nazwą ograniczenia", to jest o wiele łatwiejszy sposób.

Oto przyszłościowe rozwiązanie, które nie korzysta z sysobjects lub inny sys tabel w ogóle:

IF object_id('DF_CONSTRAINT_NAME', 'D') IS NOT NULL BEGIN 
    -- constraint exists, work with it. 
END 
0

Używam folllowing skrypt retreive wszystkie domyślne (sp_binddefaults) i wszystkie domyślne ograniczenie z następujących skryptów :

SELECT 
    t.name AS TableName, c.name AS ColumnName, SC.COLUMN_DEFAULT AS DefaultValue, dc.name AS DefaultConstraintName 
FROM 
    sys.all_columns c 
    JOIN sys.tables t ON c.object_id = t.object_id 
    JOIN sys.schemas s ON t.schema_id = s.schema_id 
    LEFT JOIN sys.default_constraints dc ON c.default_object_id = dc.object_id 
    LEFT JOIN INFORMATION_SCHEMA.COLUMNS SC ON (SC.TABLE_NAME = t.name AND SC.COLUMN_NAME = c.name) 
WHERE 
    SC.COLUMN_DEFAULT IS NOT NULL 
    --WHERE t.name = '' and c.name = '' 
1
WHILE EXISTS( 
    SELECT * FROM sys.all_columns 
    INNER JOIN sys.tables ST ON all_columns.object_id = ST.object_id 
    INNER JOIN sys.schemas ON ST.schema_id = schemas.schema_id 
    INNER JOIN sys.default_constraints ON all_columns.default_object_id = default_constraints.object_id 
    WHERE 
    schemas.name = 'dbo' 
    AND ST.name = 'MyTable' 
) 
BEGIN 
DECLARE @SQL NVARCHAR(MAX) = N''; 

SET @SQL = ( SELECT TOP 1 
    'ALTER TABLE ['+ schemas.name + '].[' + ST.name + '] DROP CONSTRAINT ' + default_constraints.name + ';' 
    FROM 
     sys.all_columns 

     INNER JOIN 
     sys.tables ST 
     ON all_columns.object_id = ST.object_id 

     INNER JOIN 
     sys.schemas 
     ON ST.schema_id = schemas.schema_id 

     INNER JOIN 
     sys.default_constraints 
     ON all_columns.default_object_id = default_constraints.object_id 

    WHERE 
     schemas.name = 'dbo' 
     AND ST.name = 'MyTable' 
    ) 
    PRINT @SQL 
    EXECUTE sp_executesql @SQL 

    --End if Error 
    IF @@ERROR <> 0 
    BREAK 
END 
1

Object Katalog Zobacz: sys.default_const raints

Widoki schematów informacji INFORMATION_SCHEMA są zgodne z ANSI, ale domyślne ograniczenia nie są częścią standardu ISO. Microsoft SQL Server udostępnia widoki wykazu systemowego w celu uzyskania informacji o metadanych obiektu SQL Server.

sys.default_constraints Widok katalogu systemowego używany do uzyskiwania informacji o ograniczeniach domyślnych.