Этот запрос находит ограничения по умолчанию для данной таблицы. Это не симпатично, я соглашаюсь:
select
col.name,
col.column_id,
col.default_object_id,
OBJECTPROPERTY(col.default_object_id, N'IsDefaultCnst') as is_defcnst,
dobj.name as def_name
from sys.columns col
left outer join sys.objects dobj
on dobj.object_id = col.default_object_id and dobj.type = 'D'
where col.object_id = object_id(N'dbo.test')
and dobj.name is not null
[РЕДАКТИРОВАНИЕ], Обновленное на комментарий
N Julien> select CONSTRAINT_NAME from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
> WHERE TABLE_NAME = '<tablename>' AND COLUMN_NAME = 'IsClosed'
Это не правильное решение, как это объяснено здесь: http://msdn.microsoft.com/en-us/library/aa175912.aspx , что:
, К сожалению, название ограничения значения по умолчанию столбца не сохранено в представлении ANSI COLUMNS, таким образом, необходимо вернуться к системным таблицам для нахождения имени
единственный способ, которым я нашел для получения, название ограничения ПО УМОЛЧАНИЮ является этим запросом:
select
t_obj.name as TABLE_NAME
,c_obj.name as CONSTRAINT_NAME
,col.name as COLUMN_NAME
from sysobjects c_obj
join sysobjects t_obj on c_obj.parent_obj = t_obj.id
join sysconstraints con on c_obj.id = con.constid
join syscolumns col on t_obj.id = col.id
and con.colid = col.colid
where
c_obj.xtype = 'D'
действительно ли я - единственный для нахождения его сумасшедшим , чтобы быть неспособным удалить легко ограничение, которое только касается столбцов, которые я пытаюсь отбросить?
я должен выполнить запрос с 3 соединениями только для завоевывания репутацию...
Можно получить ограничительные имена путем запросов information_schema системных представлений.
select CONSTRAINT_NAME from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE TABLE_NAME = '<tablename>' AND COLUMN_NAME = 'IsClosed'
Я полагаю, что явно отбрасывание ограничений до отбрасывания столбца является "более чистым" решением. Таким образом, Вы не отбрасываете ограничения, о которых Вы не можете знать. Если отбрасывание все еще перестало работать, Вы знаете, что существуют дополнительные остающиеся ограничения. Мне нравится управлять точно, что происходит с моей базой данных.
Плюс, пишущий сценарий отбрасываний явно гарантирует сценарий и надо надеяться результаты быть повторяемым точно способом, которым Вы предназначаете.
Что Вы имеете в виду случайным образом сгенерированный? Можно искать ограничения на определенный столбец в студии управления, или через sys.tables просматривают и находят, какой имя (имена).
Затем можно изменить сценарий для отбрасывания ограничений до отбрасывания столбца. Какое ограничение - это? Если это - ограничение внешнего ключа, удостоверьтесь, что выполнение этого не повредит целостность данных в Вас база данных.
Просто Генерируйте Сценарии для таблицы. Там можно найти название всех ограничений.
Вот сценарий, который удалит столбец вместе с ограничением по умолчанию. Замените MYTABLENAME
и MYCOLUMNNAME
соответствующим образом.
declare @constraint_name sysname, @sql nvarchar(max)
select @constraint_name = name
from sys.default_constraints
where parent_object_id = object_id('MYTABLENAME')
AND type = 'D'
AND parent_column_id = (
select column_id
from sys.columns
where object_id = object_id('MYTABLENAME')
and name = 'MYCOLUMNNAME'
)
set @sql = N'alter table MYTABLENAME drop constraint ' + @constraint_name
exec sp_executesql @sql
alter table MYTABLENAME drop column MYCOLUMNNAME
go
Возможно, это может помочь немного больше:
declare @tablename nvarchar(200)
declare @colname nvarchar(200)
declare @default sysname, @sql nvarchar(max)
set @tablename = 'your table'
set @colname = 'column to drop'
select @default = name
from sys.default_constraints
where parent_object_id = object_id(@tablename)
AND type = 'D'
AND parent_column_id = (
select column_id
from sys.columns
where object_id = object_id(@tablename)
and name = @colname
)
set @sql = N'alter table ' + @tablename + ' drop constraint ' + @default
exec sp_executesql @sql
set @sql = N'alter table ' + @tablename + ' drop column ' + @colname
exec sp_executesql @sql
Нужно только установить переменные @tablename & @colname, чтобы отбросить столбец.