2008-09-26 31 views
86

Tôi đang cố kiểm tra xem có tồn tại ràng buộc mặc định đã cho hay không. Tôi không muốn sử dụng bảng sysobjects, nhưng tiêu chuẩn hơn là INFORMATION_SCHEMA.Làm cách nào để tìm ràng buộc mặc định bằng cách sử dụng INFORMATION_SCHEMA?

Tôi đã sử dụng điều này để kiểm tra các bảng và các ràng buộc khóa chính trước đây, nhưng tôi không thấy các ràng buộc mặc định ở bất kỳ đâu.

Họ không có ở đó? (Tôi đang sử dụng MS SQL Server 2000).

EDIT: Tôi đang tìm cách lấy tên của ràng buộc.

Trả lời

86

Theo tôi được biết, những hạn chế giá trị mặc định là không nằm trong Tiêu chuẩn ISO, vì vậy chúng không xuất hiện trong INFORMATION_SCHEMA. INFORMATION_SCHEMA có vẻ như là lựa chọn tốt nhất cho loại nhiệm vụ này bởi vì nó là nền tảng chéo, nhưng nếu thông tin không có sẵn nên sử dụng các khung nhìn đối tượng danh mục (sys. *) Thay vì các khung nhìn của bảng hệ thống, không được chấp nhận trong SQL Server 2005 và sau đó.

Dưới đây là khá giống với câu trả lời của @ user186476. Nó trả về tên của ràng buộc giá trị mặc định cho một cột đã cho. (Đối với người dùng không phải SQL Server, bạn cần tên của mặc định để thả nó, và nếu bạn không tự đặt tên cho ràng buộc mặc định, SQL Server sẽ tạo ra một số tên điên như "DF_TableN_Colum_95AFE4B5".Để làm cho nó dễ dàng hơn để thay đổi sơ đồ của bạn trong tương lai, luôn đặt tên một cách rõ ràng những hạn chế của bạn!)

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

Lưu ý: có thể có cùng tên bảng trong các lược đồ khác nhau, vì vậy bạn cũng nên tham gia vào bảng sys.schemas. –

+1

@DanielJamesBryars sys.schemas hiện đã được thêm vào truy vấn. –

+0

Hãy xem [câu trả lời của tôi] (http://stackoverflow.com/a/32750390/57611) ngắn gọn và ngọt ngào, hoạt động trong tất cả các phiên bản của SQL Server, không có bất kỳ bảng 'sys' nào và dễ nhớ . – ErikE

2

Cột COLUMN_DEFAULT của INFORMATION_SCHEMA.COLUMNS bạn đang tìm kiếm cái gì?

+0

Có và không, nó cho tôi biết có mặc định và nó là gì, nhưng tôi cũng cần tên của ràng buộc. – WildJoe

+1

Ngoài ra, hãy lưu ý rằng nếu đăng nhập SQL thời gian chạy của bạn không sở hữu lược đồ dbo, bạn chỉ có thể tìm các giá trị NULL trong cột COLUMN_DEFAULT. –

0

Tôi không nghĩ rằng nó nằm trong INFORMATION_SCHEMA - có thể bạn sẽ phải sử dụng sysobject hoặc các bảng/lượt xem không liên quan.

Bạn sẽ nghĩ rằng sẽ có một loại cho điều này trong INFORMATION_SCHEMA.TABLE_CONSTRAINTS, nhưng tôi không thấy.

0

Có lẽ vì một số DBMS SQL khác "ràng buộc mặc định" không thực sự là một ràng buộc, bạn sẽ không tìm thấy tên của nó trong "INFORMATION_SCHEMA.TABLE_CONSTRAINTS", do đó, đặt cược tốt nhất của bạn là "INFORMATION_SCHEMA.COLUMNS" đã đề cập rồi.

(SQLServer-ngu dốt ở đây)

duy nhất một lý do tôi có thể nghĩ đến khi bạn phải biết cái tên "mặc định chế" 's là nếu SQLServer không hỗ trợ "ALTER TABLE xxx ALTER COLUMN yyy SET DEFAULT..." lệnh. Nhưng sau đó bạn đã ở trong một khu vực phi tiêu chuẩn và bạn phải sử dụng các cách sản phẩm cụ thể để có được những gì bạn cần.

33

Dường như không có tên Ràng buộc mặc định trong các chế độ xem Information_Schema.

sử dụng SELECT * FROM sysobjects WHERE xtype = 'D' AND name = @name để tìm một hạn chế mặc định bằng tên

+2

+1 cho truy vấn đơn giản –

+0

chỉ là những gì tôi cần. Cảm ơn – drdwilcox

+0

Câu hỏi trả lời trực tiếp tốt hơn các giải pháp thay thế sau này (SQL 2000 & truy vấn theo tên hạn chế). –

34

Bạn có thể sử dụng sau đây để thu hẹp kết quả thậm chí nhiều hơn bằng cách xác định tên bảng và tên cột rằng mặc định ràng buộc tương quan với:

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

Tôi tìm kiếm truy vấn đơn giản này sau một vài giờ. Thannnnnkkk youuuu! – Samuel

+0

Nên có o.xtype = 'D' để làm việc cơ sở dữ liệu nhạy cảm với trường hợp. – IvanH

+0

@ IvanH Điểm tốt! –

0

Cách sử dụng kết hợp CHECK_CONSTRAINTS và 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 không chứa bất kỳ thông tin nào về các ràng buộc mặc định. –

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

Một chút khoảng trắng sẽ đẹp hơn, nhưng điều này làm những gì mà poster ban đầu được hỏi bằng cách sử dụng các khung nhìn danh mục đối tượng (sys. *), Được Microsoft khuyến nghị trong các khung nhìn của bảng hệ thống tương thích ngược. –

11

Kịch bản dưới đây liệt kê tất cả những hạn chế mặc định và các giá trị mặc định cho các bảng người dùng trong cơ sở dữ liệu trong đó nó đang được chạy:

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

Nếu bạn muốn nhận được một hạn chế bởi các tên cột hoặc bảng, hoặc bạn muốn có được tất cả những hạn chế trong cơ sở dữ liệu, hãy xem xét các câu trả lời khác. Tuy nhiên, nếu bạn chỉ đang tìm kiếm chính xác câu hỏi đặt ra, cụ thể là, để "kiểm tra nếu một ràng buộc mặc định đã tồn tại ... theo tên của ràng buộc", thì có một cách dễ dàng hơn nhiều.

Dưới đây là một câu trả lời tương lai chứng minh rằng không sử dụng sysobjects hoặc sys khác bảng tại tất cả:

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

Tôi đang sử dụng kịch bản folllowing để truy xuất tất cả các giá trị mặc định (sp_binddefaults) và tất cả các hạn chế mặc định với các kịch bản sau đây :

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 Catalogue Xem: sys.default_const raints

Chế độ xem lược đồ thông tin INFORMATION_SCHEMA là ANSI tuân thủ, nhưng ràng buộc mặc định không phải là một phần của tiêu chuẩn ISO. Microsoft SQL Server cung cấp các khung nhìn danh mục hệ thống để nhận thông tin về siêu dữ liệu đối tượng SQL Server.

sys.default_constraints chế độ xem danh mục hệ thống được sử dụng để nhận thông tin về các ràng buộc mặc định.

SELECT so.object_id TableName, 
     ss.name AS TableSchema, 
     cc.name AS Name, 
     cc.object_id AS ObjectID,    
     sc.name AS ColumnName, 
     cc.parent_column_id AS ColumnID, 
     cc.definition AS Defination, 
     CONVERT(BIT, 
       CASE cc.is_system_named 
        WHEN 1 
        THEN 1 
        ELSE 0 
       END) AS IsSystemNamed, 
     cc.create_date AS CreationDate, 
     cc.modify_date AS LastModifiednDate 
FROM sys.default_constraints cc WITH (NOLOCK) 
    INNER JOIN sys.objects so WITH (NOLOCK) ON so.object_id = cc.parent_object_id 
    LEFT JOIN sys.schemas ss WITH (NOLOCK) ON ss.schema_id = so.schema_id 
    LEFT JOIN sys.columns sc WITH (NOLOCK) ON sc.column_id = cc.parent_column_id 
               AND sc.object_id = cc.parent_object_id 
ORDER BY so.name, 
     cc.name; 
Các vấn đề liên quan