最好在数据库中设置一个Triger.
控制主从表的关系。但不要控制的太死。
参考:DelphiClassInfo(主表)(Delphi类帮助信息)和DelphiItemInfo
(从表)(Delphi每一个类的属性/方法/事件)
//****************************************************
// DelphiClassInfo的Triger
//****************************************************
create trigger tD_DelphiClassInfo on DelphiClassInfo for DELETE as
/* ERwin Builtin Sat Nov 24 16:18:45 2001 */
/* DELETE trigger on DelphiClassInfo */
begin
declare @errno int,
@errmsg varchar(255)
/* ERwin Builtin Sat Nov 24 16:18:45 2001 */
/* DelphiClassInfo R/2 DelphiItemInfo ON PARENT DELETE RESTRICT */
if exists (
select * from deleted,DelphiItemInfo
where
/* %JoinFKPK(DelphiItemInfo,deleted," = "," and") */
DelphiItemInfo.ClassName = deleted.ClassName
)
begin
select @errno = 30001,
@errmsg = 'Cannot DELETE DelphiClassInfo because DelphiItemInfo exists.'
goto error
end
/* ERwin Builtin Sat Nov 24 16:18:45 2001 */
return
error:
raiserror @errno @errmsg
rollback transaction
end
//*****************************************************
create trigger tU_DelphiClassInfo on DelphiClassInfo for UPDATE as
/* ERwin Builtin Sat Nov 24 16:18:45 2001 */
/* UPDATE trigger on DelphiClassInfo */
begin
declare @numrows int,
@nullcnt int,
@validcnt int,
@insClassName varchar(80),
@errno int,
@errmsg varchar(255)
select @numrows = @@rowcount
/* ERwin Builtin Sat Nov 24 16:18:45 2001 */
/* DelphiClassInfo R/2 DelphiItemInfo ON PARENT UPDATE RESTRICT */
if
/* %ParentPK(" or",update) */
update(ClassName)
begin
if exists (
select * from deleted,DelphiItemInfo
where
/* %JoinFKPK(DelphiItemInfo,deleted," = "," and") */
DelphiItemInfo.ClassName = deleted.ClassName
)
begin
select @errno = 30005,
@errmsg = 'Cannot UPDATE DelphiClassInfo because DelphiItemInfo exists.'
goto error
end
end
/* ERwin Builtin Sat Nov 24 16:18:45 2001 */
return
error:
raiserror @errno @errmsg
rollback transaction
end
//****************************************************
// DelphiItemInfo的Triger
//****************************************************
create trigger tI_DelphiItemInfo on DelphiItemInfo for INSERT as
/* ERwin Builtin Sat Nov 24 16:21:11 2001 */
/* INSERT trigger on DelphiItemInfo */
begin
declare @numrows int,
@nullcnt int,
@validcnt int,
@errno int,
@errmsg varchar(255)
select @numrows = @@rowcount
/* ERwin Builtin Sat Nov 24 16:21:11 2001 */
/* DelphiClassInfo R/2 DelphiItemInfo ON CHILD INSERT RESTRICT */
if
/* %ChildFK(" or",update) */
update(ClassName)
begin
select @nullcnt = 0
select @validcnt = count(*)
from inserted,DelphiClassInfo
where
/* %JoinFKPK(inserted,DelphiClassInfo) */
inserted.ClassName = DelphiClassInfo.ClassName
/* %NotnullFK(inserted," is null","select @nullcnt = count(*) from inserted where"," and") */
if @validcnt + @nullcnt != @numrows
begin
select @errno = 30002,
@errmsg = 'Cannot INSERT DelphiItemInfo because DelphiClassInfo does not exist.'
goto error
end
end
/* ERwin Builtin Sat Nov 24 16:21:11 2001 */
return
error:
raiserror @errno @errmsg
rollback transaction
end
create trigger tU_DelphiItemInfo on DelphiItemInfo for UPDATE as
/* ERwin Builtin Sat Nov 24 16:21:11 2001 */
/* UPDATE trigger on DelphiItemInfo */
begin
declare @numrows int,
@nullcnt int,
@validcnt int,
@insClassName varchar(80),
@insItemKind int,
@insProperty varchar(100),
@errno int,
@errmsg varchar(255)
select @numrows = @@rowcount
/* ERwin Builtin Sat Nov 24 16:21:11 2001 */
/* DelphiClassInfo R/2 DelphiItemInfo ON CHILD UPDATE RESTRICT */
if
/* %ChildFK(" or",update) */
update(ClassName)
begin
select @nullcnt = 0
select @validcnt = count(*)
from inserted,DelphiClassInfo
where
/* %JoinFKPK(inserted,DelphiClassInfo) */
inserted.ClassName = DelphiClassInfo.ClassName
/* %NotnullFK(inserted," is null","select @nullcnt = count(*) from inserted where"," and") */
if @validcnt + @nullcnt != @numrows
begin
select @errno = 30007,
@errmsg = 'Cannot UPDATE DelphiItemInfo because DelphiClassInfo does not exist.'
goto error
end
end
/* ERwin Builtin Sat Nov 24 16:21:11 2001 */
return
error:
raiserror @errno @errmsg
rollback transaction
end