문제

내가 노력하고 테스트하는 경우 주어진 기본 제약 조건이 있습니다.나는 원하지 않는다 사용하는 시스템 개체의 이름은 표지만,더 많은 표준 INFORMATION_SCHEMA.

내가 사용했던 이를 확인하는 테이블과 기본 키의 제약기 전에,그러나 나는 보지 않는 기본 제약 조건을 어디든지.

그들은 없을까?(나를 사용하 MS SQL Server2000).

편집:내가 찾는 의해 얻을의 이름은 제약이 있습니다.

도움이 되었습니까?

해결책

내가 이해 한 바와 같이, 기본값 제약 조건은 ISO 표준의 일부가 아니므로 information_schema에 나타나지 않습니다. information_schema는 크로스 플랫폼이기 때문에 이러한 종류의 작업에 가장 적합한 선택처럼 보이지만 정보를 사용할 수없는 경우 SQL Server에서 더 이상 사용되지 않는 시스템 테이블보기 대신 객체 카탈로그보기 (SYS.*)를 사용해야합니다. 2005 년 이후.

아래는 @user186476의 답과 거의 동일합니다. 주어진 열에 대한 기본값 제약 조건의 이름을 반환합니다. (SQL이 아닌 서버 사용자의 경우 기본값을 삭제하려면 기본 이름이 필요하며 기본 제약 조건을 직접 이름을 지정하지 않으면 SQL Server는 "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'

다른 팁

기본 제약 조건이 다음과 관련된 테이블 이름과 열 이름을 지정하여 다음을 사용하여 결과를 더욱 좁힐 수 있습니다.

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'

기본 제약 이름이없는 것 같습니다. Information_Schema 견해.

사용 SELECT * FROM sysobjects WHERE xtype = 'D' AND name = @name이름 별 기본 제약 조건을 찾으려면

아래 스크립트에는 실행중인 데이터베이스의 사용자 테이블의 모든 기본 제약 조건과 기본값이 나와 있습니다.

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

열이나 테이블 이름으로 제약을 받으려면 데이터베이스에서 모든 제약 조건을 얻으려면 다른 답변을 살펴보십시오. 그러나 질문이 묻는 것을 정확히 찾고 있다면 "주어진 기본 제약 조건이 존재하는지 테스트 ... 제약 조건의 이름으로", 그러면 훨씬 쉬운 방법이 있습니다.

다음은 사용하지 않는 미래의 대답입니다 sysobjects 또는 기타 sys 전혀 테이블 :

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

information_schema.columns의 column_default 열은 무엇을 찾고 있습니까?

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 

나는 그것이 정보에 있다고 생각하지 않습니다.

information_schema.table_constraints에는 이것에 대한 유형이있을 것이라고 생각하지만 나는 보이지 않습니다.

아마 때문에 다른 일부 SQL Dbms"기본 제약 조건는"정말 제약 조건을 찾을 것이다 그것의 이름에"INFORMATION_SCHEMA.TABLE_CONSTRAINTS",그래서 당신의 최선의 방법은"INFORMATION_SCHEMA.으로"열 사람이 이미 언급.

(SQLServer-무식한 여기)

유일한 나의 생각할 수 있을 때를 알고 있는"기본 제약 조건은"의 이름이면 SQLServer 지원하지 않는 "ALTER TABLE xxx ALTER COLUMN yyy SET DEFAULT..." 명령입니다.그러나 당신이 이미 있는 표준 이외의 지역을 사용하여 제품-특정을 얻는 방법 당신이 필요합니다.

check_constraints와 restraint_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

Folllowing 스크립트를 사용하여 모든 기본값 (SP_BINDDEFAULTS)과 다음 스크립트를 사용한 모든 기본 제약 조건을 다시 시작합니다.

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

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

정보 스키마가 봅니다 INFORMATION_SCHEMA ANSI를 준수하지만 기본 제약 조건은 ISO 표준의 일부가 아닙니다. Microsoft SQL Server는 SQL Server Object Metadata에 대한 정보를 얻기위한 시스템 카탈로그보기를 제공합니다.

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;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top