web-dev-qa-db-fra.com

Comment supprimer une valeur par défaut ou une contrainte similaire dans T-SQL?

Je connais la syntaxe:

ALTER TABLE [TheTable] DROP CONSTRAINT [TheDefaultConstraint]

mais comment supprimer la contrainte par défaut quand je ne connais pas son nom? (Autrement dit, il a été généré automatiquement à CREATE TABLE heure.)

63
Frank Krueger

Si vous souhaitez le faire manuellement, vous pouvez utiliser Management Studio pour le rechercher (sous le nœud Contraintes de la table). 

Pour le faire en utilisant SQL:

  • Si les contraintes sont des contraintes par défaut, vous pouvez utiliser sys.default_constraints pour le trouver:

    SELECT OBJECT_NAME(parent_object_id) AS TableName, name AS ConstraintName
    FROM sys.default_constraints ORDER BY TableName, ConstraintName
    
  • Si vous recherchez également d'autres contraintes (vérification, clé unique, clé étrangère, clé primaire), vous pouvez utiliser sysconstraints:

    SELECT OBJECT_NAME(id) AS TableName, OBJECT_NAME(constid) AS ConstraintName
    FROM sysconstraints ORDER BY TableName, ConstraintName
    

Vous ne dites pas quelle version de SQL Server vous utilisez. Ce qui précède fonctionne à la fois avec SQL 2005 et SQL 2008.

45
adrianbanks

Vous pouvez utiliser ce code pour le faire automatiquement:

DECLARE @tableName VARCHAR(MAX) = '<MYTABLENAME>'
DECLARE @columnName VARCHAR(MAX) = '<MYCOLUMNAME>'
DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name 
FROM SYS.DEFAULT_CONSTRAINTS
WHERE PARENT_OBJECT_ID = OBJECT_ID(@tableName) 
AND PARENT_COLUMN_ID = (
    SELECT column_id FROM sys.columns
    WHERE NAME = @columnName AND object_id = OBJECT_ID(@tableName))
IF @ConstraintName IS NOT NULL
    EXEC('ALTER TABLE '+@tableName+' DROP CONSTRAINT ' + @ConstraintName)

Il suffit de remplacer <MYTABLENAME> et <MYCOLUMNNAME> selon le cas.

58
Polemarch

Ou vous pouvez le trouver en utilisant la vue catalogue sys.check_constraints.

4
Alex_L

Vous pouvez trouver le nom de la contrainte par sp_help [nom de la table], puis le supprimer par son nom.

Ou vous pouvez probablement le faire via le studio de gestion.

3
Tetraneutron

Utilisez les méthodes suivantes pour une seule table et une seule colonne sur une seule ligne.

declare @sql nvarchar(max); set @sql = ''; SELECT @sql+='ALTER TABLE [dbo].[YOURTABLENAME] DROP CONSTRAINT ' + ((SELECT OBJECT_NAME(constid) FROM sysconstraints WHERE OBJECT_NAME(id) = 'YOURTABLENAME'AND colid IN (SELECT ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS Where Table_Name = 'YOURTABLENAME' and COLUMN_NAME = 'YOURCOLUMNNAM'))) + ';'; EXEC sp_executesql @sql;

Si vous avez plusieurs contraintes sur la colonne, vous devrez distinguer la contrainte que vous recherchez, mais si vous n'avez qu'une contrainte par défaut, cela fera l'affaire.

Consultez les autres colonnes disponibles dans information_schema pour vous permettre de mieux distinguer.

1
sweetfa

Voici ma propre version qui supprime toutes les contraintes dépendantes - contrainte par défaut (si existant) et toutes les contraintes affectées check (comme le standard SQL semble le suggérer et certaines autres bases de données le semblent)

declare @constraints varchar(4000);
declare @sql varchar(4000);
with table_id_column_position as (
   select object_id table_id, column_id column_position
      from sys.columns where object_id is not null and object_id = object_id('TableName') and name = 'ColumnToBeDropped'
)
select @constraints = coalesce(@constraints, 'constraint ') + '[' + name + '], '
from sysobjects 
where (
  -- is CHECK constraint
  type = 'C' 
  -- dependeds on the column
  and id is not null
  and id in (
      select object_id --, object_name(object_id)
      from sys.sql_dependencies, table_id_column_position 
      where object_id is not null
      and referenced_major_id = table_id_column_position.table_id
      and referenced_minor_id = table_id_column_position.column_position
    )
) OR (
  -- is DEFAULT constraint
  type = 'D'
  and id is not null
  and id in (
    select object_id
    from sys.default_constraints, table_id_column_position
     where object_id is not null
     and parent_object_id = table_id_column_position.table_id
     and parent_column_id = table_id_column_position.column_position
  )
);
set @sql = 'alter table TableName drop ' + coalesce(@constraints, '') + ' column ColumnToBeDropped';
exec @sql

(Attention: TableName et ColumnToBeDropped apparaissent deux fois dans le code ci-dessus)

Cela fonctionne en construisant un ALTER TABLE TableName DROP CONSTRAINT c1, ..., COLUMN ColumnToBeDropped unique et en l'exécutant.

0
Piotr Findeisen