SQL Server 2005 отбрасывает столбец с ограничениями

60
задан Paul D. Waite 12 May 2011 в 20:44
поделиться

8 ответов

Этот запрос находит ограничения по умолчанию для данной таблицы. Это не симпатично, я соглашаюсь:

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
21
ответ дан edosoft 24 November 2019 в 17:41
поделиться
> 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 соединениями только для завоевывания репутацию...

6
ответ дан Julien N 24 November 2019 в 17:41
поделиться

Можно получить ограничительные имена путем запросов information_schema системных представлений.

select CONSTRAINT_NAME from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE TABLE_NAME = '<tablename>' AND COLUMN_NAME = 'IsClosed'
4
ответ дан Steve Sheldon 24 November 2019 в 17:41
поделиться

Я полагаю, что явно отбрасывание ограничений до отбрасывания столбца является "более чистым" решением. Таким образом, Вы не отбрасываете ограничения, о которых Вы не можете знать. Если отбрасывание все еще перестало работать, Вы знаете, что существуют дополнительные остающиеся ограничения. Мне нравится управлять точно, что происходит с моей базой данных.

Плюс, пишущий сценарий отбрасываний явно гарантирует сценарий и надо надеяться результаты быть повторяемым точно способом, которым Вы предназначаете.

1
ответ дан DCNYAM 24 November 2019 в 17:41
поделиться

Что Вы имеете в виду случайным образом сгенерированный? Можно искать ограничения на определенный столбец в студии управления, или через sys.tables просматривают и находят, какой имя (имена).

Затем можно изменить сценарий для отбрасывания ограничений до отбрасывания столбца. Какое ограничение - это? Если это - ограничение внешнего ключа, удостоверьтесь, что выполнение этого не повредит целостность данных в Вас база данных.

0
ответ дан DCNYAM 24 November 2019 в 17:41
поделиться

Просто Генерируйте Сценарии для таблицы. Там можно найти название всех ограничений.

-1
ответ дан 24 November 2019 в 17:41
поделиться

Вот сценарий, который удалит столбец вместе с ограничением по умолчанию. Замените 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
64
ответ дан 24 November 2019 в 17:41
поделиться

Возможно, это может помочь немного больше:

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, чтобы отбросить столбец.

16
ответ дан 24 November 2019 в 17:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: