標籤:觸發器 sqlserver
繼上次的SQL Server空間化任務之後,
筆者又接到新的任務:
當資料庫屬性欄位發生變化時,在不改變業務代碼的條件下,自動更新空間資料。
首先想到的解決方案就是觸發器。
基本思路:
在資料更新或插入完畢之後,當表的x,y欄位任意一個的值發生變化時,即開始更新空間欄位資料。
下面以攝像機表videopointinfo為例
欄位
|
類型
|
說明
|
videoid
|
varchar
|
主鍵ID
|
videoname
|
varchar
|
攝像機名
|
clientx
|
number
|
經度 |
clienty
|
number
|
緯度
|
geom
|
geometry
|
實際座標
|
-- 為表增加座標欄位alter table videopointinfo add geom geometry;-- 建立或修改觸發器, 建立用create,修改用alteralter trigger tri_videopointinfo on videopointinfoafter 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 --開啟觸發器
參考文檔:msdn - create trigger
SQLServer 觸發器初探