¿Cómo puedo encontrar una restricción predeterminada usando el ESQUEMA DE INFORMACIÓN?


Estoy tratando de probar si existe una restricción predeterminada dada. No quiero usar la tabla sysobjects, sino la más estándar INFORMATION_SCHEMA.

He utilizado esto para comprobar las tablas y las restricciones de clave primaria antes, pero no veo las restricciones predeterminadas en ninguna parte.

¿No están ahí? (Estoy usando MS SQL Server 2000).

EDITAR: Estoy buscando el nombre de la restricción.

Author: vinay Maneti, 2008-09-27

13 answers

Según entiendo, las restricciones de valor predeterminadas no forman parte del estándar ISO, por lo que no aparecen en INFORMATION_SCHEMA. INFORMATION_SCHEMA parece ser la mejor opción para este tipo de tareas porque es multiplataforma, pero si la información no está disponible, se deberían usar las vistas del catálogo de objetos (sys.* ) en lugar de vistas de tablas del sistema, que están obsoletas en SQL Server 2005 y versiones posteriores.

A continuación es más o menos lo mismo que la respuesta de @user186476. Devuelve el nombre del valor predeterminado restricción de valor para una columna dada. (Para usuarios que no son de SQL Server, necesita el nombre de la restricción predeterminada para eliminarla, y si no nombra la restricción predeterminada usted mismo, SQL Server crea un nombre loco como "DF_TableN_Colum_95AFE4B5". Para que sea más fácil cambiar su esquema en el futuro, siempre nombre explícitamente sus restricciones!)

-- 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'
 98
Author: Robert Calhoun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-16 12:56:40

Puede usar lo siguiente para restringir aún más los resultados especificando el Nombre de la Tabla y el Nombre de la Columna con los que se correlaciona la Restricción predeterminada:

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'
 38
Author: Tim Lentine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-04 13:20:15

Parece que no hay nombres de Restricción predeterminados en las vistas Information_Schema.

Use SELECT * FROM sysobjects WHERE xtype = 'D' AND name = @name para encontrar una restricción predeterminada por nombre

 36
Author: devio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-09 20:11:10

El script a continuación enumera todas las restricciones predeterminadas y los valores predeterminados para las tablas de usuario en la base de datos en la que se está ejecutando:

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
 12
Author: Johan Badenhorst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-13 09:36:06
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
 3
Author: Florent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-04 08:25:37

Si desea obtener una restricción por los nombres de las columnas o tablas, o si desea obtener todas las restricciones de la base de datos, busque otras respuestas. Sin embargo, si usted está buscando exactamente lo que la pregunta pide, es decir, a " prueba si existe una restricción predeterminada dada... por el nombre de la restricción", entonces hay una manera mucho más fácil.

Aquí hay una respuesta a prueba de futuro que no usa la sysobjects u otras sys tablas en absoluto:

IF object_id('DF_CONSTRAINT_NAME', 'D') IS NOT NULL BEGIN
   -- constraint exists, work with it.
END
 3
Author: ErikE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-24 19:00:35

Es la columna COLUMN_DEFAULT de INFORMATION_SCHEMA.COLUMNAS ¿qué estás buscando?

 2
Author: user12861,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-26 20:38:17
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
Author: user3059720,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-28 01:28:44

No creo que esté en INFORMATION_SCHEMA - probablemente tendrá que usar sysobjects o tablas/vistas obsoletas relacionadas.

Pensarías que habría un tipo para esto en INFORMATION_SCHEMA.TABLE_CONSTRAINTS, pero no veo ninguna.

 0
Author: Cade Roux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-26 21:26:54

Probablemente porque en algunos de los otros DBMSs SQL la "restricción predeterminada" no es realmente una restricción, no encontrará su nombre en "INFORMATION_SCHEMA.TABLE_CONSTRAINTS", por lo que su mejor apuesta es " INFORMATION_SCHEMA.COLUMNAS " como otros ya han mencionado.

(SQLServer-ignoramus aquí)

La única razón en la que puedo pensar cuando tienes que saber el nombre de la "restricción predeterminada"es si SQLServer no admite el comando "ALTER TABLE xxx ALTER COLUMN yyy SET DEFAULT...". Pero entonces ya estás en una zona no estándar y tiene que usar las formas específicas del producto para obtener lo que necesita.

 0
Author: Milen A. Radev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-27 00:03:53

Qué tal usar una combinación de CHECK_CONSTRAINTS y 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
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-26 21:06:25

Estoy usando el siguiente script para recuperar todos los valores predeterminados (sp_binddefaults) y todas las restricciones predeterminadas con los siguientes scripts:

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 = ''
 0
Author: Mirec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-10 09:22:15

Vista de catálogo de objetos : sys.default_constraints

Las vistas de esquema de información INFORMATION_SCHEMA son compatibles con ANSI, pero las restricciones predeterminadas no forman parte del estándar ISO. Microsoft SQL Server proporciona vistas de catálogo del sistema para obtener información sobre los metadatos de objetos de SQL Server.

sys.default_constraints vista de catálogo del sistema utilizado para obtener la información acerca de las restricciones predeterminadas.

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;
 0
Author: eigenharsha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-01 11:00:50