利用SqlServer触发器自动更新表updatetime字段值

2023-11-05

本文主要记录了使用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 会触发

触发器语句中使用了两种特殊的表,deletedinserted
    触发器被触发时,系统自动在内存中创建 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”,则表示禁用或启用该表的全部触发器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用SqlServer触发器自动更新表updatetime字段值 的相关文章

  • SQL Server 2016 JSON:选择字符串数组而不是对象数组

    我是 SQL Server 中的 JSON 新手 不知道如何返回简单的字符串数组 DECLARE T TABLE value NVARCHAR MAX INSERT INTO T value VALUES foo INSERT INTO T
  • 如何使用 php $row 检索 sql 日期时间对象?

    例如 sql SELECT FROM db query sqlsrv query conn sql while row sqlsrv fetch array query echo row date column 会崩溃 我找到的大多数答案都
  • 将 GROUP BY 与 FIRST_VALUE 和 LAST_VALUE 结合使用

    我正在处理一些当前以 1 分钟间隔存储的数据 如下所示 CREATE TABLE MinuteData Id INT MinuteBar DATETIME Open NUMERIC 12 6 High NUMERIC 12 6 Low NU
  • SQL 几何 VS 小数(8,6) 纬度、经度性能

    我正在研究选择与给定坐标一定距离内的最近点的性能 选项是以太使用两个decimal 8 6 纬度 长列或单列geography列并与之合作 我只感兴趣哪个更快 TL DR地理大约快 10 倍 好的 我已经设置了测试 几张桌子 一张id la
  • sql中的sumProduct

    我正在尝试在服务器上的表中实现 sumproduct 来自 Excel select into myTable2 from myTable1 select a b c d e select c e 100 3423 from myTable
  • 使用 SQL Pivot 显示所有行,包括记录计数为零的行

    有没有办法使用 Pivot 来包含不存在记录的行并在结果中显示 0 或 null 我希望查询的结果看起来像这样 A B C D 5 12 81 107 0 4 0 0 0 0 3 1 12 12 5 2 3 0 0 0 1 0 0 0 0
  • 年函数不支持 dt_wstr

    我无法使用下面的代码应用转换 出现错误 年函数不支持 dt wstr 我使用的表达式是 DT I4 DT WSTR 4 YEAR fisc wk end dt RIGHT 0 DT WSTR 2 MONTH fisc wk end dt 2
  • 将查询结果即时导出到文件

    我需要将查询结果导出到 csv 文件并将该文件放在网络共享文件夹中 是否可以在存储过程中实现此目的 如果是 则会出现另一个限制 我可以在没有系统管理员权限的情况下实现此目的 也就是不使用 xp cmdshell BCP 实用程序吗 如果 2
  • 使用 SQL 序数位置表示法的好处?

    背景资料 序数位置表示法 又称序数 是基于列列表中的列顺序的列简写 SELECT子句 而不是列名或列别名 通常支持在ORDER BY子句 某些数据库 MySQL 3 23 PostgreSQL 8 0 支持语法GROUP BY条款也是如此
  • WinForms 应用程序设计 - 将文档从 SQL Server 移动到文件存储

    我有一个连接到 SQL Server 的标准 WinForms 应用程序 该应用程序允许用户上传当前存储在数据库中的文档 在使用图像列的表中 我需要更改这种方法 以便将文档存储为文件 并将文件的链接存储在数据库表中 使用当前的方法 当用户上
  • 将单个列连接到逗号分隔的列表中[重复]

    这个问题在这里已经有答案了 我已经看到了人们将单个列滚动到逗号分隔列表中的多个示例 但我需要更多 这是我需要的数据和结果的示例 DECLARE SalesPerson table SalesPersonID int SalesPersonN
  • SQL Server 2008 R2 的 Try_Convert

    我正在使用 SQL Server 2008 R2 并且有一个VARCHAR我想要转换为的列DECIMAL 28 10 using CONVERT 但其中许多行的格式错误 因此无法将它们解析为数字 在这种情况下 我只想通过将结果设置为 0 或
  • 插入后用触发器更新多行(sql server)

    我有一个表 orderDetails 包含订单的产品 产品编号 color size quantity 和一个表库存 产品编号 size color stock 订单完成后 我使用此查询将项目插入表中orderDetails INSERT
  • SQL Server freetexttable 部分单词

    我第一次使用 SQL 自由文本搜索 我有点困惑为什么它会这样 我有一个联系人表 用户可以搜索并且我正在使用 SELECT Contacts Rank FROM FREETEXTTABLE Contacts O Roarty AS Conta
  • SQL Server 用分隔符分割字符串

    我有一个输入字符串 100 2 3 101 2 1 103 2 3 我想解析它并将其添加到具有 3 列的表中 因此它应该是 f x col1 col2 col3 100 2 3 类似的其他数据以逗号分隔作为记录和 作为列 Thanks ni
  • 如何让 LinqToSql 将“索引提示”传递给 sql server?

    由于我们不能相信我们的客户会更新 sql server 中的索引统计信息等 因此我们过去不得不使用索引提示 http www sql server performance com tips hints general p1 aspx 由于我
  • sql server 按组排名

    问题看似简单 但我却无法理解 这是针对 sql 服务器的 what I have in a table What I need as a output cksum id cksum id 2162514679 204 2162514679
  • 有没有办法以编程方式轻松更改多个 SSIS 包上的服务器名称?

    作为发布周期的一部分 我们正在创建多个 SSIS 包来迁移大型数据库 我们最终可能会得到大约 5 10 个 SSIS 包 由于我们有 4 个环境 开发 QA 登台 生产等 是否有一种有效的方法可以在每个 SSIS 包经历不同的服务器环境时更
  • 对多个数据库执行 SQL 查询

    我知道我的帖子与该论坛中的其他帖子的标题非常相似 但我真的找不到我需要的答案 这是我的问题 我的 Windows Server 上运行着 SQL Server 在我的 SQL Server 中 我有大约 30 个数据库 它们都具有相同的表和
  • 探查器模板可以迁移到较新版本的 SQL Profiler 吗?

    是否可以将 Profiler 模板迁移到较新版本的 SQL Server 就我而言 我想将 SQL 2008 模板带到 2012 年 我尝试过 1 直接文件复制和 2 导出 导入 在这两种情况下 旧模板都会运行 但无法修改 修改后会出现以下

随机推荐

  • LSTM matlab实现

    前期在学习特征分类的时候确实花了不少功夫 想去了解一下长短时记忆网络的分类效果如何 这里主要分享一下LSTM的一些简介和代码 这个例子展示了如何使用长短时记忆 LSTM 网络对序列数据进行分类 若要训练深度神经网络对序列数据进行分类 您可以
  • Qt之QTextEdit

    关于QTextEdit Qt5对Qt4的做了一些小的改动 看上去很多方法都发生了变化 但万变不离其中 如 槽函数setFontFamily const QFont 变为setFontFamily const QString fontFami
  • Could not retrieve mirrorlist http://poptop.sourceforge.net/yum/stable/mirrorlist-poptop-stable-rhel

    解决说明 rm etc yum repos d pptp repo yum update
  • 手把手教你Hook Android 点击事件

    文章目录 前言 一 什么是Hook 二 Hook的优势 三 Hook前置条件 1 反射 2 代理模式 四 Hook实战 总结 前言 随着技术的不断创新 Android的需求也是越来越多 Hook技术是走向Android高级开发的必经之路 提
  • linux 命令ls /du用法

    copy https www cnblogs com xueqiuqiu p 7635722 html ls的用法 ls l grep wc l或find company type f wc l 查看某文件夹下文件的个数 包括子文件夹里的
  • LeetCode数据库题目汇总二(附答案)

    81 查询结果的质量和占比 查询表 Queries Column Name Type query name varchar result varchar position int rating int 此表没有主键 并可能有重复的行 此表包
  • Java Web 里Servlet的介绍与理解

    文章目录 目录 文章目录 前言 一 Servlet是什么 Servlet介绍 Servlet的工作流程可以用下面的图来表示 二 使用Servlet的步骤 1 创建一个Maven项目 然后在pom xml中导入所需的Jar包 2 编写继承了S
  • 练习题_进程

    1 一个正在运行的进程 当发生某一事件 将其挂在 A A 等待队列 B 运行队列 C 就绪队列 D 任意一个队列 解析 只有在分时系统时间片完时 进程由运行转为就绪状态 一 般来说 有事件发生时 进程会被挂在等待队列 2 下列选项中 导致创
  • MySQL用户管理和权限管理

    MySQL用户管理和权限管理 在项目中 一个数据库有很多人需要使用 不能所有的人都使用相同的权限 如果人比较多 一人一个用户也很难管理 一般来说 会分超级管理员权限 管理员权限 读写权限 只读权限等 这样方便管理 当然 具体怎么管理权限根据
  • SaaS架构实现理论(四)可伸缩多租户

    目录 1 伸缩性 Scalable 的概念 2 应用服务器层的水平扩展 2 1基于Session复制的水平扩展方式 2 2基于Session Sticky的水平扩展方式 2 3基于Cache的集中式Session实现水平扩展 2 4三种水平
  • ubuntu18.04安装RTX2080ti显卡驱动+cuda10.2+cudnn

    因为系统环境变量崩溃 进行重做了系统 全部还原 在本机重新安装了显卡驱动 cuda等 具体系统版本如下 系统环境 ubuntu18 04 显卡 rtx2080ti cuda版本 10 2 安装RTX2080ti显卡驱动 1 ubuntu 1
  • Go语言中字典树的实现

    写在前面 字典树在存储 查询方面应用广泛 所以特总结一下 利用GO语言实现字典树 具体实现 字典树的实现主要还是基于树形结构 如果只是小写字母的话 那其实字典树是一个26叉树 每个节点最多都可以有26个子节点 从而可以利用一个长度为26的数
  • 查看docker-compose --version报错syntax error near unexpected token `(‘‘usr/local/bin/docker-compose:

    问题 执行docker compose version查看版本是报错如下 usr local bin docker compose line 2 html No such file or directory usr local bin do
  • 【CV with Pytorch】第 6 章 :姿态估计

    人体姿势估计 HPE 是一项计算机视觉任务 它通过估计给定帧 视频中的主要关键点 例如眼睛 耳朵 手和腿 来检测人体姿势 图6 1显示了人体姿态估计的一个例子 图 6 1 HPE示例 人体姿势检测有助于跟踪人体部位和关节 在人体中识别的一些
  • Java:使用Iterator迭代器遍历集合数据

    1 使用迭代器遍历ArrayList集合 package com jredu oopch07 import java util ArrayList import java util Iterator import java util Lis
  • 在Spring 中元素的作用

    一 介绍 spring的配置文件中常包含如下元素
  • Liunx创建新用户登录异常:/usr/bin/xauth: error/timeout in locking authority file /home/liuqidong/.Xauthority

    Liunx创建新用户登录异常 usr bin xauth error timeout in locking authority file home liuqidong Xauthority 问题1 在服务器上创建新的用户userA 在使用s
  • c++ 中vector的count是unsigned int而C#中泛型的count为int

    需要注意的 在使用一个返回值之前 要知道这个返回值是什么类型的 不要根据自己的臆断来写 否则c 很多bug不知道原因 十分注意 对比的时候 是自动转成unsigned int类型进行比较的 Orz C 中的泛型 用count都是int类型
  • 连通图的桥(对桥和割点的理解)

    题目链接 https cn vjudge net problem UVA 796 顺便总结一下 对于连通图的桥和割点 首先 从tarjan的角度来说 dfn数组代表的是当前节点的编号 也就是时间戳 low数组代表的是当前节点能够到达的最早的
  • 利用SqlServer触发器自动更新表updatetime字段值

    本文主要记录了使用SqlServer数据库触发器自动更新表的 更新时间updatetime 字段 在 MySQL数据库中 某行数据创建时间字段 createtime 行最新更新时间字段updatetime 可建表时分别用 datetime