我有一个带有"DEFAULT“约束的列。我想创建一个删除该列的脚本。
问题是它返回以下错误:
Msg 5074, Level 16, State 1, Line 1
The object 'DF__PeriodSce__IsClo__4BCC3ABA' is dependent on column 'IsClosed'.
Msg 4922, Level 16, State 9, Line 1
ALTER TABLE DROP COLUMN IsClosed failed because one or more objects access this column.
我找不到一种简单的方法来删除列及其所有相关的约束(只找到查看系统表的大脚本……必须有(!!)这是一种“很好”的方式。)
由于默认约束的名称是随机生成的,所以我不能按名称删除它。
更新:
约束类型为"DEFAULT“。
我看到了你们所有人提出的解决方案,但我发现它们都很“脏”……难道你不觉得?我不知道是用Oracle还是MySQL,但可以这样做:
DROP COLUMN xxx CASCADE CONSTRAINTS
它丢弃了所有相关的约束。或者至少它会自动删除映射到该列的约束(至少CHECK约束!)
在MSSQL中没有这样的东西吗?
发布于 2008-12-12 10:36:38
此查询查找给定表的默认约束。这不是很好,我同意:
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
根据Julien N的评论编辑更新
发布于 2009-07-23 13:51: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
发布于 2010-07-25 03:57:54
也许它可以提供更多的帮助:
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变量即可删除该列。
https://stackoverflow.com/questions/314998
复制相似问题