Я знаю синтаксис:
ALTER TABLE [TheTable] DROP CONSTRAINT [TheDefaultConstraint]
но как сбросить ограничение по умолчанию, когда я не знаю его имени? (То есть, он был автогенерирован со временем CREATE TABLE.)
Я знаю синтаксис:
ALTER TABLE [TheTable] DROP CONSTRAINT [TheDefaultConstraint]
но как сбросить ограничение по умолчанию, когда я не знаю его имени? (То есть, он был автогенерирован со временем CREATE TABLE.)
Если вы хотите сделать это вручную, вы можете использовать Management Studio, чтобы найти его (под Constraints node внутри таблицы).
Чтобы сделать это с помощью SQL:
Если ограничения являются ограничениями по умолчанию, вы можете использовать sys.default_constraints, чтобы найти его:
SELECT OBJECT_NAME(parent_object_id) AS TableName, name AS ConstraintName
FROM sys.default_constraints ORDER BY TableName, ConstraintName
Если вы ищете другие ограничения (check, unique, foreign key, default, primary key), вы можете использовать sysconstraints:
SELECT OBJECT_NAME(id) AS TableName, OBJECT_NAME(constid) AS ConstraintName
FROM sysconstraints ORDER BY TableName, ConstraintName
Вы не говорите, какую версию SQL Server вы используете. Вышеупомянутая работа выполняется как для SQL 2005, так и для SQL 2008.
Вы можете использовать этот код для этого автоматически:
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 '[email protected]+' DROP CONSTRAINT ' + @ConstraintName)
Просто замените <MYTABLENAME> и <MYCOLUMNNAME> соответствующим образом.
Вы можете найти имя ограничения с помощью sp_help [имя таблицы], а затем отбросить его по имени.
Или вы можете сделать это через студию управления.
Или вы можете найти его, используя представление каталога sys.check_constraints.
Для одной таблицы и столбца в одной строке используйте следующие
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;
Если у вас есть несколько ограничений на столбец, вам нужно будет различать ограничение, за которым вы находитесь, но если у вас есть ограничение по умолчанию, это сделает трюк.
Проверьте другие столбцы, доступные в информационном_схеме, чтобы вы могли дальше различать.
Здесь идет моя собственная версия, которая снижает все зависимые ограничения - ограничение по умолчанию (если существует) и все затронутые контрольные ограничения (как, кажется, предлагает стандарт SQL, и как некоторые другие базы данных выглядят так)
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
(Остерегайтесь: оба TableName и ColumnToBeDropped дважды появляются в коде выше)
Это работает, построив одиночный ALTER TABLE TableName DROP CONSTRAINT c1, ..., COLUMN ColumnToBeDropped и выполнив его.