2013年11月

首页2013年11月
29
Nov
0

SQL Server 临时禁用和启用所有外键约束

--

exec sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL';

exec sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL';

exec(@UpdateTable);

--获得禁用所有外键约束的语句
select? 'ALTER TABLE ['? + b.name +? '] NOCHECK CONSTRAINT ' +? a.name +';' as? 禁用约束
from? sysobjects? a ,sysobjects? b
where? a.xtype ='f' and? a.parent_obj = b.id
--获得启用所有外键约束的语句
select? 'ALTER TABLE [' + b.name +? '] CHECK CONSTRAINT ' +? a.name +';' as? 启用约束
from? sysobjects? a ,sysobjects? b
where? a.xtype ='f' and? a.parent_obj = b.id

 

SqlServer禁用、启用外键约束

---启用or禁用指定表所有外键约束
alter table PUB_STRU  NOCHECK constraint all;
alter table PUB_STRU  CHECK constraint all;

 

---生成启用or禁用指定表外键约束的sql
select 'ALTER TABLE ' + b.name + ' NOCHECK CONSTRAINT ' + a.name +';'  from sysobjects a ,sysobjects b where a.xtype ='f' and a.parent_obj = b.id and b.name='表名';
select 'ALTER TABLE ' + b.name + ' CHECK CONSTRAINT ' + a.name +';'  from sysobjects a ,sysobjects b where a.xtype ='f' and a.parent_obj = b.id and b.name='表名';

 

生成的sql如下:

 

ALTER TABLE PUB_STRU NOCHECK CONSTRAINT PUBSTRU_FK1; 
ALTER TABLE PUB_STRU NOCHECK CONSTRAINT PUBSTRU_FK2; 
ALTER TABLE PUB_STRU CHECK CONSTRAINT PUBSTRU_FK1; 
ALTER TABLE PUB_STRU CHECK CONSTRAINT PUBSTRU_FK2;

 

查看约束状态(查询字典表 sys.foreign_keys,该字典表开始出现于sqlserver2005及以上版本):

select name , is_disabled from sys.foreign_keys order by name;

其中:

name? : 外键约束名称

is_disabled : 是否已禁用

17
Nov
0

锁定窗口更新完数据再更新界面的方法

[c]Application.ProcessMessages;

LockWindowUpdate(Self.Handle);?//锁住当前窗口

LockWindowUpdate(0)//解除锁定窗口

SendMessage(ClientHandle,WM_SETREDRAW,0,0);

SendMessage(ClientHandle,WM_SETREDRAW,1,0);

ReDrawWindow(ClientHandle,nil,0,RDW_INVALIDATE or RDW_ALLCHILDREN);[/c]

LockWindowUpdate不但闪烁,而且有可能引起桌面闪烁。因为LockWindowUpdate并不忽略消息,只是暂时不响应,所以有可能积聚多个重画消息,并在使用LockWindowUpdate(0)之后依次响应。
而使用SendMessage(ClientHandle,WM_SETREDRAW,0,0)之后,控件根本不接收重画消息,除非使用SendMessage(ClientHandle,WM_SETREDRAW,1,0)之后;
LockWindowUpdate的意思是暂时禁止某控件或窗口所在的区域更新(这个区域可能有多个窗口),LockWindowUpdate(0)的意思是有更新消息就更新屏幕上所有该更新的窗口吧。所以LockWindowUpdate(0)之后,若此前有重画消息积聚,会立刻重画。所以使用LockWindowUpdate会在不同的时候有不同的表现,比如屏幕上窗口多少、堆放情况等等,所以有时不闪有时却闪个不停。
SendMessage(ClientHandle,WM_SETREDRAW,0,0)的意思是不接收任何重画消息;
SendMessage(ClientHandle,WM_SETREDRAW,1,0)的意思是可以接收并响应重画消息了,但并不立即重画,所以必须附加 ReDrawWindow(ClientHandle,nil,0,RDW_INVALIDATE or RDW_ALLCHILDREN);