用TSQL语句如何知道CHECK约束的三个属性????
通过对sysobjets、sysconstraints、syscomments的查询,可以得到CHECK约束作用的对象、CHECK约束的名称以及内容,但是如何得知CHECK约束的“创建中检查现存数据”、“对复制强制约束”、对INSERT和UPDATE强制约束”三个属性的值呢?在企业管理器中可以通过复选框来选的,在查询结果中哪项是???
帮助里面对这三个表(视图)的介绍中好多字段为“保留”,唉。
问题点数:20、回复次数:9Top
1 楼chinaandys(降龙十八炒&&蛋炒饭)回复于 2005-01-03 17:26:01 得分 6
check核查约束。是确定数据完整性的约束之一。是用来检查你所输入的数据是否符合check约束.
最安全的,两个都要选.--insert和update强制约束.
偶一般用TSQL语句Top
2 楼sizheng0320(四正)回复于 2005-01-03 17:31:47 得分 0
是这样的,我想在界面中显示出这三个属性,如何得到它们的值?做得就像企业管理器中的样子。
哪个字段是这三个属性的值?我读出来好根据它们来判断……Top
3 楼631799(杭州工人)回复于 2005-01-03 18:32:10 得分 6
alter table tb add constraint ck_a check length(name)<=8 --检查现有数据
alter table tb with nocheck add constraint ck_a check length(name)<=8 --忽略现有数据Top
4 楼sizheng0320(四正)回复于 2005-01-03 18:37:19 得分 0
您说的这个我也知道。
唉,看来我还是没说明白。
刚才试验了一下,发现在企业管理器中改变CHECK约束的那三个属性(改变复选框的状态),查询sysobjects表中相应的CHECK约束记录,发现其status字段的值发生改变,但我又找不到规律。
我的意思是,能否有什么方法,在相关的系统表中查询某个字段,其值为0就为“创建中检查现存数据”、其值为1就为“对复制强制约束”之类的???Top
5 楼chinaandys(降龙十八炒&&蛋炒饭)回复于 2005-01-03 18:38:25 得分 8
syscontranintsTop
6 楼sizheng0320(四正)回复于 2005-01-03 19:00:25 得分 0
constid int 约束号。
id int 拥有该约束的表 ID。
colid smallint 在其上定义约束的列 ID,如果是表约束则为 0。
spare1 tinyint 保留。
status int 位图指示状态。可能的值包括:
1 = PRIMARY KEY 约束。
2 = UNIQUE KEY 约束。
3 = FOREIGN KEY 约束。
4 = CHECK 约束。
5 = DEFAULT 约束。
16 = 列级约束。
32 = 表级约束。
actions int 保留。
error int 保留。
以上是该系统表的介绍。但实际上这是个系统视图,是基于sysobjects生成的,这个姑且不管,那么哪个字段可以看出一个CHECK约束的三个属性的状况呢?
也就是说,对于一个CHECK约束,是否创建中检查现存数据”、是否“对复制强制约束”、是否“对INSERT和UPDATE强制约束”,如何看出来???Top
7 楼sizheng0320(四正)回复于 2005-01-04 16:37:28 得分 0
发现改变三个属性的状态后,sysobjects中相应记录的status值发生变化,似乎有规律可循。
意外发现的是,改变状态后,id居然也发生变化。估计是UPDATE是先DELETE后INSERT的原因吧。Top
8 楼sizheng0320(四正)回复于 2005-01-05 00:32:59 得分 0
试验了一下,已得出结论如下:
“创建中检查现存数据”、“对复制强制约束”、“对INSERT和UPDATE强制约束”三项属性分别对应000的三位,0为不选,1为选中
建立一个测试表,为其建立列级CHECK约束和表级CHECK约束,先令其为空表。
下面结果中,等号左边为三个属性的选中状态,右边为sysobjects表中约束记录的status字段值:
对于列级约束:
000=3330
001=3074
010=2306
011=2050
100=3330(保存后仍未选中,不知为何)
101=3074
110=2306
111=2
发现除111外,其余首位为1均作为0看待。
对于表级约束:
000=3328
001=3072
010=2304
011=2048
100=3328
101=3072
110=2304
111=0
可发现与列级约束有同样的问题,同时,对于相同的二进制值,表级约束比列级约束少2。
但值得注意的是,以上测试是在表中无数据的情况下,故可能引起三位二进制数的最高位无意义。下面测试表中有数据的结果:
对于列级约束:
000=3330
001=3074
010=2306
011=2050
100=3330
101=3074
110=2306
111=2
对于表级约束:
000=3328
001=3072
010=2304
011=2048
100=3328
101=3072
110=2304
111=0
可见结果完全相同。
猜测原因是“创建中检查现存数据”一项只在CHECK约束保存瞬间作用,保存后系统即将其取
消,故若查看已有的CHECK约束,该选项已无意义,故为不选中状态。
写的可能有点乱,不知各位看懂没,呵呵。Top
9 楼tuwicn(木狼)回复于 2005-03-07 22:33:25 得分 0
楼主的钻研精神令人尊敬!Top
相关问题
- 求救约束语句
- 如何用sql语句删除主键约束,并且在修改了列属性之后再把主键约束加上(放分100,解决问题立即相送,决不食言)
- 如何用sql语句删除主键约束,并且在修改了列属性之后再把主键约束加上(放分100,解决问题立即相送,决不食言)
- INSERT 语句与 COLUMN FOREIGN KEY 约束冲突。
- DELETE 语句与 COLUMN REFERENCE 约束冲突?怎么解决?
- 求教关于一个表的约束语句的区别
- DELETE 语句与 COLUMN REFERENCE 约束 'FK__titleauth__au_id__0519C6AF' 冲突
- 怎么用sql语句为表增加一个主键约束
- 如何用SQL语句修改列的属性?
- 如何通过语句改变CStatic的caption属性




