SQLSERVER中由删除字段发现的奇怪现象!(50分)

  • 主题发起人 flyingboat
  • 开始时间
F

flyingboat

Unregistered / Unconfirmed
GUEST, unregistred user!
在SQLSERVER中创建的字段经常会出现过一段时间DROP其中的字段会出错的问题,
比如在查询分析器中执行:'alter table tbTest1 drop column bn'会出现下面的出错提示:
"
服务器: 消息 5074,级别 16,状态 1,行 1
对象 'DF__tbTest1__bn__15DA3E5D' 依赖于 列 'bn'。
服务器: 消息 4922,级别 16,状态 1,行 1
ALTER TABLE DROP COLUMN bn 失败,因为有一个或多个对象访问此列。
"

仔细分析的数据库中的系统表后发现是字段存在一个默认约束,因而在直接删除此字段时会出错!
需要先把这个默认约束DROP后才能正常地DROP这个字段.
但奇怪的是我在创建表的SQL语句中只定义了表的主键及字段的ISNULL约束,如:
create table tbtest1 (bh int not null,mc varchar(10) null )
并没有定义字段的默认约束,那么这个约束是哪来的呢?是SQLSERVER自动创建的吗?
那它为什么要为字段创建这么一个默认约束呢,难不成是吃饱了撑的[:D]
而且并不是表中的每一个字段都会有这个默认约束,
可以通过执行下面这个SQL语句看到表中每个字段的是否存在一个默认约束:
select table_name=a.name,col_name=c.name,def_name=b.name,col_id=c.id,def_id=c.cdefault
from sysobjects a,sysobjects b,syscolumns c
where a.id=c.id and c.cdefault*=b.id
and a.name='tbtest1'-- and c.name='bbb'

虽然用DROP这个SQL语句无法直接删除被定义了默认约束的字段,
但在企业管理器的表设计器中删除字段却不会出异常,不知道看来这个默认约束是不是Microsoft有意加的,
但原因和作用何在我就百思不得其解了!

说了这么多,是想了解一个其它用SQLSERVER的朋友们是否也碰到过这个问题,
是否有更好的办法可以避免这种情况呢?或者通过对数据库选项进行设置就可以解决?
实在不行的话在DROP COLUMN前只有先查询有没有默认约束并DROP这个约束了!

 
没人关注?
 
你不给它建约束,它怎么可能自己自动建约束??
再说了,你莫名其妙删除字段干吗?
 
我也不知道它为什么会自动建约束啊,所以才会发这个帖子!
不信你用我帖子中的SQL语句查查你的SQLSERVER数据库看看是不是这样!

至于增删字段是我现在开发的系统的一个功能,怎么叫莫名其妙呢!
另外,难道字段只能增不能删吗?
 
我在sql server 2000中试了,没任何问题,语句如下:
create table tbtest1 (bh int not null,mc varchar(10) null )
ALTER TABLE tbtest1 drop COLUMN bh
 
对了,这个现象忘了说了,就是表在刚创建时是正常的,其字段删除不会有错,
但在用一段时间后就会出现我前面说的那种情况,其规律我没找出来!
最好的是检查方法是在已有的数据库中用我前面提供的SQL语句查询一下即可知,
此时去DROP那些有默认约束的字段是肯定会出错的!
 
多人接受答案了。
 
flyingboat:
QReprot做的报表,有一列实现了自动换行,怎樣做能讓QrSharp的高度能夠自動跟著變化?
急需您的幫助,請告知:fwcy@sohu.com
 
顶部