控制主从表的关系

最好在数据库中设置一个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值