现在的位置: 首页 > 综合 > 正文

问题:Default引起的问题

2013年04月13日 ⁄ 综合 ⁄ 共 2288字 ⁄ 字号 评论关闭

问题:

  CREATE   TABLE   tablename(     columnname   VARCHAR(20)   not   NULL   Default   0)    
  GO  
  ALTER   TABLE   doc   DROP   COLUMN   columnname     
  GO  
  会出这样的错误提示  
  服务器:   消息   5074,级别   16,状态   1,行   1  
  对象   'DF__tablename__columnname__4865BE2A'   依赖于   列   'columnname'。  
  服务器:   消息   4922,级别   16,状态   1,行   1  
  ALTER   TABLE   DROP   COLUMN   columnname   失败,因为有一个或多个对象访问此列。  
  请问如何删除这样的列呀!!!

 

原因: 

在SQL Server 中,如果给表的一个字段设置了默认值,就会在系统表sysobjects中生成一个默认约束。

这时如果强制去修改这个字段,当然就会出现错误。

 

 解决:

如果你只想删除这个字段,只要先删除这个约束,在删除这个字段就可以:

(1)

declare   @sql   varchar(200)  
  set   @sql   =   'alter   table    tablename   drop   constraint   '+   (select   o.name     from   syscolumns   c,sysobjects   o   where   c.id     =   object_id('tablename')   and   c.name   =   'columnname'     and   c.cdefault   =   o.id)  
  exec(@sql)  
  alter   table   tablename   drop   column   columnname
  go

(2)

sql server 中删除默认约束的通用sql脚本
在SQL Server 中,如果给表的一个字段设置了默认值,就会在系统表sysobjects中生成一个默认约束。
如果想删除这个设置了默认值的字段(假设此字段名column1),
执行“ALTER TABLE table1 DROP COLUMN column1”时就会报错:
The object 'DF__xxxxxxxxxxx' is dependent on column 'column1'.
ALTER TABLE DROP COLUMN column1failed because one or more objects access this column.

所以在删除此字段时需要先将系统表中的对应默认约束删除, 可以使用下面的脚本进行删除:
-- this script drops the default constraint which is generated by the setting of default value.
DECLARE @tablename VARCHAR(100), @columnname VARCHAR(100), @tab VARCHAR(100)
SET @tablename='CountryGroupEmailAndWaitAux'
SET @columnname='actionOfHasNoValidEmail'

declare @defname varchar(100)
declare @cmd varchar(100)

select @defname = name
FROM sysobjects so
JOIN sysconstraints sc
ON so.id = sc.constid
WHERE object_name(so.parent_obj) = @tablename
AND so.xtype = 'D'
AND sc.colid =
(SELECT colid FROM syscolumns
WHERE id = object_id(@tablename) AND
name = @columnname)

select @cmd='alter table '+ @tablename+ ' drop constraint '+ @defname
if @cmd is null print 'No default constraint to drop'
exec (@cmd)

在删除对应的默认约束后,执行:
ALTER TABLE table1 DROP COLUMN column1
即可删除字段。

(1)和(2)同理

如果你不想删除这个字段,想修改这个字段的类型,可能采取以下方法:

从错误提示我们可以看到这样一个字段“DF__tablename__columnname__4865BE2A”,这就是系统产生的一个约束名,我们可以将这个约束删除,以后在做我们想上的操作,同样适用于以上想删除字段的操作。

这个约束名我们可以通过对表产生“Sql script”的脚本中查到,然后进行以下操作

ALTER TABLE [dbo].[epcUser] DROP
   CONSTRAINT [DF__tablename__columnname__4865BE2A]
  
  Alter Table [dbo].[epcUser]
  Alter Column IsPasswordChangeRequired tinyint Not Null
  
  ALTER TABLE [dbo].[epcUser] ADD
   CONSTRAINT [DF__tablename__columnname__4865BE2A] DEFAULT (1) FOR [IsPasswordChangeRequired]

 

OK,这样我们的问题解决了。

抱歉!评论已关闭.