论文部分内容阅读
在各个领域,人们对数据的安全性提出了很高的要求,人为地传递数据已不是一个现实问题,尤其是在一个数据信息发生改变,直接影响到其他一连串的数据信息发生变化,数据库如果没有自动的更新功能实现,将无法预知数据发生变化之后的结果。
一、SQL Server数据库自动更新
SQL Server是一个高性能的客户端/服务器结构的关系数据库管理系统,它能够同多种操作系统兼容,[2]它为用户提供了一种强大的数据库管理功能。提供了数据的网络安全性和数据的自动更新。它主要应用于现代中小型数据库的开发。
在SQL Server2000中数据的更新检查,常用的方法是通过表之间的级联关系(参照关系)来实现,它主要实现主表与从表之间主码与外码的检测,是无法实现非主键的检查,更无法实现主表中非主键值发生变化导致从表中数据的自动更新。数据的更新关联,可以通过一种特殊的存储过程---触发器来实现。
二、SQL Server中trigger自动更新功能的原理
(一)trigger类型
SQL Server数据库中trigger是绑定在相应的表上的,有Insert、Delete、Update三种类型的trigger [1]。
Insert触发器是当用户向建立了Insert触发器的表上,添加记录时,自动执行的功能部分。它被触发之后,会产生一个Inserted表,自动存放被添加的记录信息。
Delete触发器是当用户删除建立了Delete触发器的表上记录信息时(不能使用TRUNCATE TABLE语句),自动执行该trigger,它被触发之后,会产生一个Deleted表,自动存放从表中被删除的记录信息。
Update触发器是当用户修改建立了Update触发器的表中记录时,自动执行的trigger。它被触发之后,会产生一个Inserted表,用来自动存放修改之后的记录,一个Deleted表,用来存放修改之前的记录。
(二)trigger对数据的自动更新过程
设想数据库中有三个表,三个表中数据相互关联,如关联表图所示。
1、表的关联关系。(1)表I中的数据直接同表II中的数据相关联,表I中的数据直接来源于表II;(2)表II中的数据直接同表III中的数据相关联,表II中的数据直接来源于表III;(3)表I中的数据同表III中数据间接关联,表I中的数据间接来源于表III。
2、表的传递关系。(1)当更新表III中的数据信息,表II中的相关记录信息发生变化;(2)当更新表II中信息,表I中相应的信息发生变化;(3)当更新表III中数据,表I、表II中相应数据信息发生变化。
3、建立trigger。为了保持表I(或表II)中数据信息与表II(或表I)中数据信息的一致性,首先在表III(或表II)上建立相应的触发器(Insert,Delete,Update),在触发器中编写相应的表III(或表II)发生变化后促使表II(或表I)中信息发生变化的操作语句序列。从而保证在表III(或表II)中数据发生变化之后,表II(或表I)中的数据信息也随着被自动更新。
三、trigger自动更新实现
(一)示例表
已知有镇表、村表和居民信息表,表结构如表1、表2和表3所示。镇表中包含镇编号、镇名、镇占地面积三个字段,村表中包含村编号、村名称、村占地面积和所属镇四个字段,居民信息表中包含住户编号、住户名、居住面积和所属村四个字段。
说明:镇表中的镇占地面积=村表中所属镇相同的村占地面积之和,村表中的村占地面积=居民信息表中所属村相同的居民占地面积之和。
(二)创建触发器
1、创建Insert触发器和Update触发器
当向居民信息表中添加记录信息,要使得村表中的村占地面积自动发生变化,而村表中占地面积发生变化,使得镇表中镇占地面积发生变化,首先给居民信息表创建Insert触发器,然后给村表创建update触发器,居民信息表Insert触发器,如代码段1所示。
create trigger jmxb on 居民信息表 for insert
as
update 村表
set 村表.村占地面积=村表.村占地面积+(select sum(inserted.居住面积) from inserted group by 所属村 )
where 村表.村编号=(select 所属村 from inserted)
go
代码段1添加记录信息触发器
当向居民信息表中添加记录信息,自动触发触发器jmxb,通过代码中的"Group By 所属村"将添加记录按所属村进行分组,然后通过"sum(居住面积)"求添加记录中所属各个村的居住面积,最后将对应村的面积累加到村表的村占地面积中。
此时村表中某村的占地面积发生了变化,这时镇表中相应镇(等于村表中数据发生变化的所属镇)的占地面积也应该随之发生改变。所以必须建立村表的Update触发器,如代码段2所示。
create trigger cb on 村表 for update
as
update 镇表
set 镇表.镇占地面积=镇表.镇占地面积-(select sum(deleted.村占地面积) from deleted group by 所属镇)+(select sum(inserted.村占地面积) from inserted group by 所属镇)
where 镇表.镇编号=(select 所属镇 from inserted)
go
代码段2 村表的Update触发器
当村表中的记录信息发生改变,自动触发触发器cb,实现镇表中占地面积的自动更新。
2、添加记录,实现数据自动更新
通过"insert 居民信息表 values('002A03','刘平',100.2, '002A')"语句向居民信息表中添加记录,村表与镇表中数据自动更新后的结果如表6所示。
3、创建Delete触发器
当删除居民信息表中记录信息时,要村表中村占地面积会被减少,从而使得镇表中镇占地面积减少。首先给居民信息表建立Delete触发器,再给村表建立Update触发器。居民信息表Delete触发器,如代码段3所示。
create trigger del on 居民信息表 for delete
as
update 村表
set 村表.村占地面积=村表.村占地面积-(select sum(deleted.居住面积) from deleted group by 所属村 )
where 村表.村编号=(select 所属村 from deleted)
代码段3删除记录信息触发器
删除居民信息表中记录信息,自动触发触发器del,通过代码中的"Group By 所属村"将删除记录按所属村进行分组,然后通过"sum(居住面积)"求删除记录中所属各个村的居住面积,最后将对应村的面积从村表的村占地面积消除。
此时村表中某村的占地面积发生了变化,这时镇表中相应镇(等于村表中数据发生变化的所属镇)的占地面积也应该随之发生改变。由于村表中已经建立了Update触发器cb,一旦村表中村占地面积信息被修改,则自动执行触发器cb,实现镇表中占地面积的改变。
4、删除记录,实现数据自动更新
使用语句"Delete 居民信息表 where 住户编号='001A02'"实现居民信息表中住户编号为"001A02"的住户信息的删除,村表中村编号为"001A"的占地面积和镇表中镇编号为"001"的占地面积相应的发生变化,如表7所示。
5、创建Update触发器
当修改居民信息表中记录信息时,村表中村占地面积可能会发生变化,从而使得镇表中镇占地面积发生变化。要实现该功能,首先给居民信息表建立Update触发器,如代码段4所示,再给村表建立Update触发器。
create trigger upd on 居民信息表 for update
as
update 村表
set 村表.村占地面积=村表.村占地面积-(select sum(deleted.居住面积) from deleted group by 所属村 )+(select sum(inserted.居住面积) from inserted group by 所属村 )
where 村表.村编号=(select 所属村 from deleted)
代码段4修改记录信息触发器
修改居民信息表中记录信息,自动触发触发器upd,通过代码中的"Group By 所属村"将修改记录按所属村进行分组,然后通过"sum(居住面积)"求修改记录中所属各个村的居住面积。deleted表中存放修改之前的记录信息,inserted表中存放修改之后的记录信息,语句中通过减去修改之前的记录信息,然后加上修改之后的记录信息,从而实现了村表中数据和居民信息表中数据的一致性。
此时村表中某村的占地面积发生了变化,这时镇表中相应镇(等于村表中数据发生变化的所属镇)的占地面积也应该随之发生改变。由于村表中已经建立了Update触发器cb,一旦村表中村占地面积信息被修改,则自动执行触发器cb,实现镇表中占地面积与村表中占地面积的一致性。
6、修改记录,实现数据自动更新
使用语句"Update 居民信息表 Set 居住面积=45where住户编号='001A01'"实现居民信息表中住户编号为"001A01"的住户信息的修改,村表中村编号为"001A"的占地面积和镇表中镇编号为"001"的占地面积相应的发生变化,如表8。
四、结束语
给表建立触发器,一旦触发器相关联的表中数据信息的变化,必然会导致触发器语句中相关联表中的数据信息发生改变,从而实现数据的自动更新。
参考文献:
[1]郑阿奇.SQL SERVER实用教程[M].北京:电子工业出版社,2001.
[2]微软公司.数据库程序设计:SQL Server2000数据库程序设计[M].北京:高等教育出版社,2004:437-456.
一、SQL Server数据库自动更新
SQL Server是一个高性能的客户端/服务器结构的关系数据库管理系统,它能够同多种操作系统兼容,[2]它为用户提供了一种强大的数据库管理功能。提供了数据的网络安全性和数据的自动更新。它主要应用于现代中小型数据库的开发。
在SQL Server2000中数据的更新检查,常用的方法是通过表之间的级联关系(参照关系)来实现,它主要实现主表与从表之间主码与外码的检测,是无法实现非主键的检查,更无法实现主表中非主键值发生变化导致从表中数据的自动更新。数据的更新关联,可以通过一种特殊的存储过程---触发器来实现。
二、SQL Server中trigger自动更新功能的原理
(一)trigger类型
SQL Server数据库中trigger是绑定在相应的表上的,有Insert、Delete、Update三种类型的trigger [1]。
Insert触发器是当用户向建立了Insert触发器的表上,添加记录时,自动执行的功能部分。它被触发之后,会产生一个Inserted表,自动存放被添加的记录信息。
Delete触发器是当用户删除建立了Delete触发器的表上记录信息时(不能使用TRUNCATE TABLE语句),自动执行该trigger,它被触发之后,会产生一个Deleted表,自动存放从表中被删除的记录信息。
Update触发器是当用户修改建立了Update触发器的表中记录时,自动执行的trigger。它被触发之后,会产生一个Inserted表,用来自动存放修改之后的记录,一个Deleted表,用来存放修改之前的记录。
(二)trigger对数据的自动更新过程
设想数据库中有三个表,三个表中数据相互关联,如关联表图所示。
1、表的关联关系。(1)表I中的数据直接同表II中的数据相关联,表I中的数据直接来源于表II;(2)表II中的数据直接同表III中的数据相关联,表II中的数据直接来源于表III;(3)表I中的数据同表III中数据间接关联,表I中的数据间接来源于表III。
2、表的传递关系。(1)当更新表III中的数据信息,表II中的相关记录信息发生变化;(2)当更新表II中信息,表I中相应的信息发生变化;(3)当更新表III中数据,表I、表II中相应数据信息发生变化。
3、建立trigger。为了保持表I(或表II)中数据信息与表II(或表I)中数据信息的一致性,首先在表III(或表II)上建立相应的触发器(Insert,Delete,Update),在触发器中编写相应的表III(或表II)发生变化后促使表II(或表I)中信息发生变化的操作语句序列。从而保证在表III(或表II)中数据发生变化之后,表II(或表I)中的数据信息也随着被自动更新。
三、trigger自动更新实现
(一)示例表
已知有镇表、村表和居民信息表,表结构如表1、表2和表3所示。镇表中包含镇编号、镇名、镇占地面积三个字段,村表中包含村编号、村名称、村占地面积和所属镇四个字段,居民信息表中包含住户编号、住户名、居住面积和所属村四个字段。
说明:镇表中的镇占地面积=村表中所属镇相同的村占地面积之和,村表中的村占地面积=居民信息表中所属村相同的居民占地面积之和。
(二)创建触发器
1、创建Insert触发器和Update触发器
当向居民信息表中添加记录信息,要使得村表中的村占地面积自动发生变化,而村表中占地面积发生变化,使得镇表中镇占地面积发生变化,首先给居民信息表创建Insert触发器,然后给村表创建update触发器,居民信息表Insert触发器,如代码段1所示。
create trigger jmxb on 居民信息表 for insert
as
update 村表
set 村表.村占地面积=村表.村占地面积+(select sum(inserted.居住面积) from inserted group by 所属村 )
where 村表.村编号=(select 所属村 from inserted)
go
代码段1添加记录信息触发器
当向居民信息表中添加记录信息,自动触发触发器jmxb,通过代码中的"Group By 所属村"将添加记录按所属村进行分组,然后通过"sum(居住面积)"求添加记录中所属各个村的居住面积,最后将对应村的面积累加到村表的村占地面积中。
此时村表中某村的占地面积发生了变化,这时镇表中相应镇(等于村表中数据发生变化的所属镇)的占地面积也应该随之发生改变。所以必须建立村表的Update触发器,如代码段2所示。
create trigger cb on 村表 for update
as
update 镇表
set 镇表.镇占地面积=镇表.镇占地面积-(select sum(deleted.村占地面积) from deleted group by 所属镇)+(select sum(inserted.村占地面积) from inserted group by 所属镇)
where 镇表.镇编号=(select 所属镇 from inserted)
go
代码段2 村表的Update触发器
当村表中的记录信息发生改变,自动触发触发器cb,实现镇表中占地面积的自动更新。
2、添加记录,实现数据自动更新
通过"insert 居民信息表 values('002A03','刘平',100.2, '002A')"语句向居民信息表中添加记录,村表与镇表中数据自动更新后的结果如表6所示。
3、创建Delete触发器
当删除居民信息表中记录信息时,要村表中村占地面积会被减少,从而使得镇表中镇占地面积减少。首先给居民信息表建立Delete触发器,再给村表建立Update触发器。居民信息表Delete触发器,如代码段3所示。
create trigger del on 居民信息表 for delete
as
update 村表
set 村表.村占地面积=村表.村占地面积-(select sum(deleted.居住面积) from deleted group by 所属村 )
where 村表.村编号=(select 所属村 from deleted)
代码段3删除记录信息触发器
删除居民信息表中记录信息,自动触发触发器del,通过代码中的"Group By 所属村"将删除记录按所属村进行分组,然后通过"sum(居住面积)"求删除记录中所属各个村的居住面积,最后将对应村的面积从村表的村占地面积消除。
此时村表中某村的占地面积发生了变化,这时镇表中相应镇(等于村表中数据发生变化的所属镇)的占地面积也应该随之发生改变。由于村表中已经建立了Update触发器cb,一旦村表中村占地面积信息被修改,则自动执行触发器cb,实现镇表中占地面积的改变。
4、删除记录,实现数据自动更新
使用语句"Delete 居民信息表 where 住户编号='001A02'"实现居民信息表中住户编号为"001A02"的住户信息的删除,村表中村编号为"001A"的占地面积和镇表中镇编号为"001"的占地面积相应的发生变化,如表7所示。
5、创建Update触发器
当修改居民信息表中记录信息时,村表中村占地面积可能会发生变化,从而使得镇表中镇占地面积发生变化。要实现该功能,首先给居民信息表建立Update触发器,如代码段4所示,再给村表建立Update触发器。
create trigger upd on 居民信息表 for update
as
update 村表
set 村表.村占地面积=村表.村占地面积-(select sum(deleted.居住面积) from deleted group by 所属村 )+(select sum(inserted.居住面积) from inserted group by 所属村 )
where 村表.村编号=(select 所属村 from deleted)
代码段4修改记录信息触发器
修改居民信息表中记录信息,自动触发触发器upd,通过代码中的"Group By 所属村"将修改记录按所属村进行分组,然后通过"sum(居住面积)"求修改记录中所属各个村的居住面积。deleted表中存放修改之前的记录信息,inserted表中存放修改之后的记录信息,语句中通过减去修改之前的记录信息,然后加上修改之后的记录信息,从而实现了村表中数据和居民信息表中数据的一致性。
此时村表中某村的占地面积发生了变化,这时镇表中相应镇(等于村表中数据发生变化的所属镇)的占地面积也应该随之发生改变。由于村表中已经建立了Update触发器cb,一旦村表中村占地面积信息被修改,则自动执行触发器cb,实现镇表中占地面积与村表中占地面积的一致性。
6、修改记录,实现数据自动更新
使用语句"Update 居民信息表 Set 居住面积=45where住户编号='001A01'"实现居民信息表中住户编号为"001A01"的住户信息的修改,村表中村编号为"001A"的占地面积和镇表中镇编号为"001"的占地面积相应的发生变化,如表8。
四、结束语
给表建立触发器,一旦触发器相关联的表中数据信息的变化,必然会导致触发器语句中相关联表中的数据信息发生改变,从而实现数据的自动更新。
参考文献:
[1]郑阿奇.SQL SERVER实用教程[M].北京:电子工业出版社,2001.
[2]微软公司.数据库程序设计:SQL Server2000数据库程序设计[M].北京:高等教育出版社,2004:437-456.