복붙노트

[SQL] 어떻게 INFORMATION_SCHEMA를 사용하여 기본 제약 조건을 찾을 수 있습니까?

SQL

어떻게 INFORMATION_SCHEMA를 사용하여 기본 제약 조건을 찾을 수 있습니까?

나는 주어진 기본 제약 조건이 존재하는지 테스트하기 위해 노력하고있어. 나는을 sysobjects 테이블,하지만 더 많은 표준 INFORMATION_SCHEMA를 사용하지 않습니다.

내가 전에 테이블과 기본 키 제약 조건을 확인하려면이 옵션을 사용했지만, 난 아무데도 기본 제약 조건이 표시되지 않습니다.

그들은 거기 있습니까? (I는 MS SQL 서버 2000을 사용하고 있습니다).

편집 : 제약 조건의 이름을 얻을 찾고 있어요.

해결법

  1. ==============================

    1.내가 알고있는 것처럼 그들이 INFORMATION_SCHEMA에 표시되지 않도록 기본 값 제약 조건은 ISO 표준의 일부가 아닙니다. INFORMATION_SCHEMA 대신 SQL 서버에서 사용되지 않습니다 시스템 테이블 뷰의이 크로스 플랫폼이기 때문에,하지만 정보가 개체 카탈로그 뷰 사용해야 가능 아닌 경우 (SYS가. *) 작업의 이런 종류의 최선의 선택처럼 보인다 2005 이상.

    내가 알고있는 것처럼 그들이 INFORMATION_SCHEMA에 표시되지 않도록 기본 값 제약 조건은 ISO 표준의 일부가 아닙니다. INFORMATION_SCHEMA 대신 SQL 서버에서 사용되지 않습니다 시스템 테이블 뷰의이 크로스 플랫폼이기 때문에,하지만 정보가 개체 카탈로그 뷰 사용해야 가능 아닌 경우 (SYS가. *) 작업의 이런 종류의 최선의 선택처럼 보인다 2005 이상.

    다음은 거의 user186476의 대답 @ 동일합니다. 그것은 주어진 열의 기본값 제약의 이름을 반환합니다. 드롭하기 위해 (비 SQL 서버 사용자의 경우, 디폴트의 이름이 필요합니다, 당신은 기본 제약 자신의 이름을하지 않는 경우, SQL 서버 "DF_TableN_Colum_95AFE4B5"와 같은 어떤 미친 이름을 작성합니다. 변화에 쉽게하려면 미래의 스키마는 항상 명시 적으로 제약 조건의 이름을!)

    -- 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'
    
  2. ==============================

    2.당신은 기본 제약의 상관 관계에있는 테이블 이름과 열 이름을 지정하여 더 많은 결과를 좁힐를 사용할 수 있습니다 :

    당신은 기본 제약의 상관 관계에있는 테이블 이름과 열 이름을 지정하여 더 많은 결과를 좁힐를 사용할 수 있습니다 :

    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'
    
  3. ==============================

    3.INFORMATION_SCHEMA 뷰에는 기본 제약 조건 이름은없는 것 같다.

    INFORMATION_SCHEMA 뷰에는 기본 제약 조건 이름은없는 것 같다.

    사용 SELECT * sysobjects의 FROM WHERE 위해 xtype = 'D'AND 이름 = @name 이름으로 기본 제약 조건을 찾을 수

  4. ==============================

    4.목록 모든 기본 제약과 실행되고있는 데이터베이스의 사용자 테이블에 대한 기본 값 아래 스크립트 :

    목록 모든 기본 제약과 실행되고있는 데이터베이스의 사용자 테이블에 대한 기본 값 아래 스크립트 :

    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
    
  5. ==============================

    5.당신은 열 또는 테이블 이름으로 제약을 얻고 싶은, 또는 당신은 데이터베이스의 모든 제약, 다른 답변을보고 싶어합니다. 그러나, 당신은 "주어진 기본 제약 조건이있는 경우 시험 ... 제약의 이름으로"질문에, 즉, 요청 정확히 후 훨씬 쉽게 방법이 찾고있는 경우.

    당신은 열 또는 테이블 이름으로 제약을 얻고 싶은, 또는 당신은 데이터베이스의 모든 제약, 다른 답변을보고 싶어합니다. 그러나, 당신은 "주어진 기본 제약 조건이있는 경우 시험 ... 제약의 이름으로"질문에, 즉, 요청 정확히 후 훨씬 쉽게 방법이 찾고있는 경우.

    여기에 모든에서 sysobjects의 다른 SYS 테이블을 사용하지 않는 미래 지향적 대답입니다 :

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

    6.

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

    7.당신이 찾고있는 무엇을 INFORMATION_SCHEMA.COLUMNS의 COLUMN_DEFAULT 열인가?

    당신이 찾고있는 무엇을 INFORMATION_SCHEMA.COLUMNS의 COLUMN_DEFAULT 열인가?

  8. ==============================

    8.

    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 
    
  9. ==============================

    9.Necromancing. 당신은 단지 기본-제약 조건이 존재하는지 확인해야하는 경우 (기본적으로 제약 조건 (들)을 제대로 관리 DB를 다른 이름을 가질 수 있습니다) 사용 INFORMATION_SCHEMA.COLUMNS (column_default) :

    Necromancing. 당신은 단지 기본-제약 조건이 존재하는지 확인해야하는 경우 (기본적으로 제약 조건 (들)을 제대로 관리 DB를 다른 이름을 가질 수 있습니다) 사용 INFORMATION_SCHEMA.COLUMNS (column_default) :

    IF NOT EXISTS(
        SELECT * FROM INFORMATION_SCHEMA.COLUMNS
        WHERE (1=1) 
        AND TABLE_SCHEMA = 'dbo' 
        AND TABLE_NAME = 'T_VWS_PdfBibliothek' 
        AND COLUMN_NAME = 'PB_Text'
        AND COLUMN_DEFAULT IS NOT NULL  
    )
    BEGIN 
        EXECUTE('ALTER TABLE dbo.T_VWS_PdfBibliothek 
                    ADD CONSTRAINT DF_T_VWS_PdfBibliothek_PB_Text DEFAULT (N''image'') FOR PB_Text; 
        '); 
    END 
    

    당신은 단지 제약 조건 이름을 확인하려면 :

    -- Alternative way: 
    IF OBJECT_ID('DF_CONSTRAINT_NAME', 'D') IS NOT NULL 
    BEGIN
        -- constraint exists, deal with it.
    END 
    

    그리고 마지막으로, 당신은 단지보기라는 INFORMATION_SCHEMA.DEFAULT_CONSTRAINTS를 만들 수 있습니다 :

    CREATE VIEW INFORMATION_SCHEMA.DEFAULT_CONSTRAINTS 
    AS 
    SELECT 
         DB_NAME() AS CONSTRAINT_CATALOG 
        ,csch.name AS CONSTRAINT_SCHEMA
        ,dc.name AS CONSTRAINT_NAME 
        ,DB_NAME() AS TABLE_CATALOG 
        ,sch.name AS TABLE_SCHEMA 
        ,syst.name AS TABLE_NAME 
        ,sysc.name AS COLUMN_NAME 
        ,COLUMNPROPERTY(sysc.object_id, sysc.name, 'ordinal') AS ORDINAL_POSITION 
        ,dc.type_desc AS CONSTRAINT_TYPE 
        ,dc.definition AS COLUMN_DEFAULT 
    
        -- ,dc.create_date 
        -- ,dc.modify_date 
    FROM sys.columns AS sysc -- 46918 / 3892 with inner joins + where 
    -- FROM sys.all_columns AS sysc -- 55429 / 3892 with inner joins + where 
    
    INNER JOIN sys.tables AS syst 
        ON syst.object_id = sysc.object_id 
    
    INNER JOIN sys.schemas AS sch
        ON sch.schema_id = syst.schema_id 
    
    INNER JOIN sys.default_constraints AS dc 
        ON sysc.default_object_id = dc.object_id
    
    INNER JOIN sys.schemas AS csch
        ON csch.schema_id = dc.schema_id 
    
    WHERE (1=1) 
    AND dc.is_ms_shipped = 0 
    
    /*
    WHERE (1=1) 
    AND sch.name = 'dbo'
    AND syst.name = 'tablename'
    AND sysc.name = 'columnname'
    */
    
  10. ==============================

    10.나는 그것이 INFORMATION_SCHEMA에서 생각하지 않습니다 - 당신은 아마 sysobjects의 또는 관련되지 않는 테이블 / 뷰를 사용해야합니다.

    나는 그것이 INFORMATION_SCHEMA에서 생각하지 않습니다 - 당신은 아마 sysobjects의 또는 관련되지 않는 테이블 / 뷰를 사용해야합니다.

    당신은 INFORMATION_SCHEMA.TABLE_CONSTRAINTS이의 유형이있을 것입니다 생각,하지만 난 하나를 볼 수 없습니다.

  11. ==============================

    11.아마 다른 SQL DBMS를 "기본 제약 조건"중 일부는 정말 제한되지 않습니다에 있기 때문에, 당신은 다른 사람이 이미 언급 한 바와 같이 가장 좋은 건 "INFORMATION_SCHEMA.COLUMNS"그래서, "INFORMATION_SCHEMA.TABLE_CONSTRAINTS"에서 이름을 찾을 수 있습니다.

    아마 다른 SQL DBMS를 "기본 제약 조건"중 일부는 정말 제한되지 않습니다에 있기 때문에, 당신은 다른 사람이 이미 언급 한 바와 같이 가장 좋은 건 "INFORMATION_SCHEMA.COLUMNS"그래서, "INFORMATION_SCHEMA.TABLE_CONSTRAINTS"에서 이름을 찾을 수 있습니다.

    (여기 SQLServer에-무지한)

    난 당신이있을 때 생각할 수있는 유일한 이유는 SQLServer를 지원하지 않는 경우의 이름은 "기본 제약 조건을"알고 명령 "ALTER TABLE은 ALTER COLUMN의 YYY의 기본값 설정을 ... xxx는". 하지만 당신은 표준이 아닌 영역에 이미 당신은 당신이 필요로하는 것을 얻기 위해 제품 별 방법을 사용해야합니다.

  12. ==============================

    12.어떻게 CHECK_CONSTRAINTS 및 CONSTRAINT_COLUMN_USAGE의 조합을 사용하는 방법에 대한 :

    어떻게 CHECK_CONSTRAINTS 및 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
    
  13. ==============================

    13.나는 모든 기본값 (sp_bindefault)와 다음 스크립트와 모든 기본 제약 조건을 검색하기 위해 다음 스크립트를 사용하고 있습니다 :

    나는 모든 기본값 (sp_bindefault)와 다음 스크립트와 모든 기본 제약 조건을 검색하기 위해 다음 스크립트를 사용하고 있습니다 :

    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 = ''
    
  14. ==============================

    14.개체 카탈로그보기 : sys.default_constraints

    개체 카탈로그보기 : sys.default_constraints

    정보 스키마 뷰 INFORMATION_SCHEMA는 ANSI 호환 있지만, 기본 제약 조건은 ISO 표준의 일부가 아닙니다. Microsoft SQL Server는 SQL Server 개체 메타 데이터에 대한 정보를 얻기 위해 시스템 카탈로그 뷰를 제공합니다.

    기본 제약 조건에 대한 정보를 얻는 데 사용 sys.default_constraints 시스템 카탈로그 뷰.

    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;
    
  15. from https://stackoverflow.com/questions/141682/how-do-i-find-a-default-constraint-using-information-schema by cc-by-sa and MIT license