利用SqlServer觸發器自動更新表updatetime字段值

  本文主要記錄了使用SqlServer數據庫觸發器自動更新表的"更新時間updatetime"字段sql

  在 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字段會自動記錄行的更新時間spa

  可是在在SqlServer數據庫中, 以上這種方式建表 createtime字段效果如預期,但updatetime字段並不能自動記錄更新時間。因此本人利用SqlServer觸發器達到目標,來不及解釋了,快上車解決問題,用以下格式建表便可:3d

-- 庫名 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裏插入數據:code

insert into myschema.TAB_USR(ID, SEX, NAME) values ('101', '0', '霜霜'), ('102', '1', '老王'), ('103', '1', '大師'), ('104', '1', '小明');

 

 能夠看到 CRTTIM  UPDTIM字段的時間值都有,爲當前系統時間值:blog

進行更新操做:事務

UPDATE myschema.TAB_USR set SEX='1' where ID='101';

再次查看UPDTIM字段的值已經自動更新:ip

觸發器基本格式:內存

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」,則表示禁用或啓用該表的所有觸發器。

相關文章
相關標籤/搜索