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.)
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.
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.
Ou vous pouvez le trouver en utilisant la vue catalogue sys.check_constraints.
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.
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.
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.