继上次的SQL Server空间化任务之后,
笔者又接到新的任务:
当数据库属性字段发生变化时,在不改变业务代码的条件下,自动更新空间数据。
首先想到的解决方案就是触发器。
基本思路:
在数据更新或插入完毕之后,当表的x,y字段任意一个的值发生变化时,即开始更新空间字段数据。
下面以摄像机表videopointinfo为例
字段 | 类型 | 说明 |
videoid | varchar | 主键ID |
videoname | varchar | 摄像机名 |
clientx | number | 经度 |
clienty | number | 纬度 |
geom | geometry | 实际坐标 |
-- 为表增加坐标字段 alter table videopointinfo add geom geometry; -- 创建或修改触发器, 创建用create,修改用alter alter trigger tri_videopointinfo on videopointinfo after update,insert as -- 当clientx或clienty有更新时调用 if update(clientx) or update(clienty) begin -- 当clientx或clienty任意一个有空值时设置geom为空 if (select clientx from inserted) is null or (select clienty from inserted) is null begin update v set geom=null from videopointinfo v where exists(select 1 from inserted where videoflag=v.videoflag) Return end update v set geom=geometry::STGeomFromText('POINT('+convert(varchar,CLIENTX)+' '+convert(varchar,CLIENTY)+')',4326) from videopointinfo v where exists(select 1 from inserted where videoflag=v.videoflag) end
最后可以尝试着更新几条数据,测试效果。
再来条开启和禁用触发器的语句
disable trigger trigDB on database --禁用触发器 enable trigger trigDB on database --开启触发器