本文主要記錄了使用SqlServer數據庫觸發器自動更新表的"更新時間updatetime"字段
在 MySQL數據庫中,某行數據創建時間字段 createtime 、 行最新更新時間字段updatetime 建表時可分別
用"datetime DEFAULT CURRENT_TIMESTAMP" 和 " datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"約束,MySQL建表如下:
CREATE TABLE `student` ( `id` int(10) unsigned not null auto_increment, `name` varchar(60) default '' comment '學生姓名', `sex` varchar(1) default 'Y' comment '性別', `createtime` datetime DEFAULT CURRENT_TIMESTAMP, `updatetime` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
即可達到預期目標,updatetime字段會自動記錄行的更新時間
但是在在SqlServer數據庫中, 以上這種方式建表 createtime字段效果如預期,但updatetime字段並不能自動記錄更新時間。所以本人利用SqlServer觸發器達到目標,來不及解釋了,快上車解決問題,用如下格式建表即可:
-- 庫名 my_ss -- schema名 myschema (默認是dbo) -- 表名: TAB_USR -- 觸發時機、條件: 有update操作后 IF OBJECT_ID(N'myschema.TAB_USR', N'U') IS NOT NULL DROP TABLE myschema.TAB_USR; CREATE TABLE myschema.TAB_USR( ID varchar(6) not null default '', SEX char(1) not null default '', NAME varchar(10) not null default '', CRTTIM datetime DEFAULT CURRENT_TIMESTAMP, UPDTIM datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (ID) ); -- 添加表注釋 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用戶信息表', @level0type=N'SCHEMA', @level0name=N'myschema', @level1type=N'TABLE', @level1name=N'TAB_USR'; -- 添加字段注釋 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'編號', @level0type=N'SCHEMA', @level0name=N'myschema', @level1type=N'TABLE', @level1name=N'TAB_USR', @level2type=N'column', @level2name=N'ID'; EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'性別', @level0type=N'SCHEMA', @level0name=N'myschema', @level1type=N'TABLE', @level1name=N'TAB_USR', @level2type=N'column', @level2name=N'SEX'; EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'姓名', @level0type=N'SCHEMA', @level0name=N'myschema', @level1type=N'TABLE', @level1name=N'TAB_USR', @level2type=N'column', @level2name=N'NAME'; -- 指定使用的庫名 USE [my_ss] GO -- 國際慣例 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- 創建觸發器 CREATE TRIGGER [myschema].[tgr_TAB_USR_updtim] ON [myschema].[TAB_USR] -- 觸發時機、條件 AFTER UPDATE AS BEGIN SET NOCOUNT ON; UPDATE myschema.[TAB_USR] SET UPDTIM=SYSDATETIME() WHERE ID IN (SELECT DISTINCT ID FROM inserted) END GO -- 啟動觸發器 ALTER TABLE [myschema].[TAB_USR] ENABLE TRIGGER tgr_TAB_USR_updtim
向 表TAB_USR里插入數據:
insert into myschema.TAB_USR(ID, SEX, NAME) values ('101', '0', '霜霜'), ('102', '1', '老王'), ('103', '1', '大師'), ('104', '1', '小明');
可以看到 CRTTIM UPDTIM字段的時間值都有,為當前系統時間值:
進行更新操作:
UPDATE myschema.TAB_USR set SEX='1' where ID='101';
再次查看UPDTIM字段的值已經自動更新:
觸發器基本格式:
use 數據庫名 go exec sp_helptext '觸發器名稱' CREATE TRIGGER trigger_name ON table_name [WITH ENCRYPTION] -- 加密 FOR | AFTER | INSTEAD OF [DELETE, INSERT, UPDATE] AS T-SQL語句 GO --with encryption 表示加密觸發器定義的sql文本 --delete,insert,update指定觸發器的類型
關於SqlServer觸發器的基礎知識:
SqlServer有三種常規觸發器, DML觸發器、DDL觸發器、登錄觸發器
DML數據操作語言觸發器,insert delete update 會觸發
觸發器語句中使用了兩種特殊的表,deleted和 inserted表
觸發器被觸發時,系統自動在內存中創建 deleted inserted表,只讀,不能修改,觸發器執行完成后,自動刪除
deleted表用於存儲 delete update語句鎖影響的行的副本,在執行delete 或 update語句時,行從觸發器表中刪除,並傳輸到 deleted表中,deleted表和觸發器表通常沒有相同的行
inserted表用於存儲 insert 和 update語句所影響的行的副本,在一行插入或者更新事務處理中,新建行被同時添加到inserted表 和觸發器表中,inserted表中的行數觸發器表中新行的副本
觸發器中 for、 after 、instead of 三者區別:
instead of :相當於系統不直接對表進行操作,而是把操作內容交給觸發器,讓觸發器檢查將要進行的操作是否正確,如正確才能進行相應的操作,每個表只能創建一個 instead of 觸發器
after :系統對表執行了 insert update delete的操作之后,才觸發觸發器,進行后續操作,每個表可創建多個 after觸發器
for : 和 after效果一樣
查看所有觸發器:
查看數據庫里的觸發器
use 數據庫名
go
select * from sysobjects where xtype='TR'
如:
USE [my_ss] GO SELECT * FROM SYSOBJECTS WHERE XTYPE='TR'
禁用:alter table 表名 disable trigger 觸發器名稱
啟用:alter table 表名 enable trigger 觸發器名稱
如果有多個觸發器,則各個觸發器名稱之間用英文逗號隔開。
如果把“觸發器名稱”換成“ALL”,則表示禁用或啟用該表的全部觸發器。