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


  本文主要記錄了使用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”,則表示禁用或啟用該表的全部觸發器。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM