Pergunta

Eu estou tentando testar se existe uma determinada restrição padrão. Eu não quero usar a tabela sysobjects, mas o INFORMATION_SCHEMA mais padrão.

Eu usei isso para verificar se há mesas e restrições de chave primária antes, mas eu não vejo restrições padrão em qualquer lugar.

Não são lá? (Estou usando o MS SQL Server 2000).

EDIT:. Eu estou olhando para começar pelo nome da restrição

Foi útil?

Solução

Pelo que entendi, as restrições de valor padrão não fazem parte do padrão ISO, para que eles não aparecem na INFORMATION_SCHEMA. INFORMATION_SCHEMA parece ser a melhor escolha para este tipo de tarefa porque é multi-plataforma, mas se a informação não é um disponível deve usar as exibições do catálogo objeto (SYS. *) Em vez de vistas tabela do sistema, que são preteridos no SQL Server 2005 e mais tarde.

A seguir é praticamente o mesmo como resposta de @ user186476. Ele retorna o nome da restrição valor padrão para uma determinada coluna. (Para usuários não-SQL Server, é necessário o nome do padrão, a fim de soltá-lo, e se você não nomear a restrição padrão mesmo, SQL Server cria um nome louco como "DF_TableN_Colum_95AFE4B5". Para tornar mais fácil a mudança seu esquema no futuro, sempre nomear explicitamente suas limitações!)

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

Outras dicas

Você pode usar o seguinte para estreitar ainda mais os resultados, especificando o nome Nome e coluna da tabela que o padrão correlatos constrangimento para:

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'

Não parece haver nenhum nome padrão de restrição nas vistas Information_Schema.

SELECT * FROM sysobjects WHERE xtype = 'D' AND name = @name uso para encontrar uma restrição padrão pelo nome

O script abaixo lista todas as restrições padrão e os valores padrão para as tabelas de usuário no banco de dados no qual ele está sendo executado:

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

Se você deseja obter um constrangimento pelos nomes coluna ou tabela, ou você deseja obter todas as restrições no banco de dados, olhar para outras respostas. No entanto, se você está apenas procurando exatamente o que a pergunta pede, nomeadamente, para "testar se uma determinada restrição padrão existe ... pelo nome da restrição" , então há uma maneira muito mais fácil .

Aqui é uma resposta à prova de futuro que não usa o sysobjects ou outras tabelas sys em tudo:

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

É a coluna COLUMN_DEFAULT de INFORMATION_SCHEMA.COLUMNS o que você está procurando?

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 

Eu não acho que é na INFORMATION_SCHEMA -. Você provavelmente terá que usar sysobjects ou tabelas obsoleto relacionadas / vistas

Você pensaria que haveria um tipo para isso em INFORMATION_SCHEMA.TABLE_CONSTRAINTS, mas eu não vejo um.

Provavelmente porque em algumas das outras SQL SGBDs a "restrição padrão" não é realmente uma restrição, você não encontrar seu nome na "INFORMATION_SCHEMA.TABLE_CONSTRAINTS", então sua melhor aposta é "INFORMATION_SCHEMA.COLUMNS", como outros têm já mencionado.

(SQLServer-ignorante aqui)

A única razão que eu posso pensar quando você tem que saber a "restrição padrão" O nome é se SQLServer não suporta comandos "ALTER TABLE xxx ALTER COLUMN yyy SET DEFAULT...". Mas, então, você já está em uma zona de não-padrão e você tem que usar as formas específicas do produto para conseguir o que você precisa.

Que tal usar uma combinação de CHECK_CONSTRAINTS e 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

Eu estou usando folllowing roteiro para recuperar todos os padrões (sp_binddefaults) e toda restrição padrão com scripts a seguir:

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

Objeto Catálogo Ver : sys.default_constraints

Os pontos de vista do esquema de informações INFORMATION_SCHEMA são ANSI-compliant, mas as restrições padrão não são uma parte do padrão ISO. Microsoft SQL Server fornece visualizações de catálogo do sistema para obter informações sobre metadados do objeto SQL Server.

sys.default_constraints catálogo sistema de visão usado para obter as informações sobre restrições padrão.

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top