首页 > 数据库 >sqlserver触发器的使用以及inserted和deleted详解

sqlserver触发器的使用以及inserted和deleted详解

时间:2023-03-20 10:35:02浏览次数:44  
标签:触发器 deleted sqlserver user 表中 operator inserted delete


背景:最近在项目中有需求是当人员表中有变动时(比如:增加人员、修改人员信息、删除人员信息)需要把这张表中的变动的信息同步到它对应的日志表中。那么如果用代码写逻辑的话在执行效率上会比较慢,正好sqlserver提供了触发器,我们可以利用触发器进行解决这个问题。

什么时sqlserver触发器

触发器是在对表进行插入、更新或删除操作时自动执行的特殊存储过程。触发器通常用于强制业务规则,触发器是一种高级约束,可以定义比CHECK约束更为复杂的约束:可以执行复杂的SQL语句(if/while/case),可以引用其他表中的列。触发器定义在特定的表上,与表相关,自动触发执行,不能直接调用,是一个事务(可回滚)。

触发器的种类

触发器是在对表进行增、删、改操作才能够触发触发器。这里分为after(之后)和instead of(之前)触发。after触发器要求只有执行某一操作(insert、update、delete)之后触发器才能被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身,其优先级高于触发语句的执行。

触发器的使用

以下内容介绍after之后的触发器。以navicat工具为例。

首先我们需要监测哪个数据库就在哪个数据库创建触发器。比如:需要监听人员表中的数据变化,那么就需要在人员表中添加触发器。点击表的设计,找到触发器

sqlserver触发器的使用以及inserted和deleted详解_数据库

在上方点击添加触发器,并设置触发器的名称以及触发的时间和在什么情况下触发。

sqlserver触发器的使用以及inserted和deleted详解_sqlserver_02

设置完这些之后可以去写逻辑

 

sqlserver触发器的使用以及inserted和deleted详解_触发器_03

 首先介绍一下sql触发器中两个表,inserted和deleted。可以理解为这两张表是临时表,它的表字段和在哪个表中创建触发器的字段是一致的,比如:我在人员管理表中添加了触发器,那么inserted表和deleted表中的字段是一致的。这两张表是系统在内存中创建的两张表,不会存储到数据库中,且这两张表是只读的,不能修改数据。当触发器完成工作之后,这两张表也会被删除

表操作

inserted表

deleted表

insert

存放新增的记录


update

存放新增的记录

存放更新前的数据

delete


存放新增的数据

举例:

BEGIN

-- if EXISTS (select * from deleted) //判断deleted表中是否有数据
declare @is_delete char(20) //定义变量
if EXISTS(
select is_delete from inserted
)

declare @userId varchar(20)
declare @userName VARCHAR(20)
declare @machineId VARCHAR(40)
declare @operator_Id VARCHAR(20)
declare @operator varchar(20)
select @is_delete=is_delete,@userId=user_id,@userName=user_name,@machineId=machine_id,@operator_Id=update_user_id,@operator=update_user_name FROM inserted //给变量赋值

IF @is_delete=1 判断条件
BEGIN
insert into User_Management_Logs(user_id,user_name,act,machine_id,operator,operator_id) VALUES(@userId,@userName,'删除用户',@machineId,@operator,@operator_Id) //在哪张表中插入数据

END
END

标签:触发器,deleted,sqlserver,user,表中,operator,inserted,delete
From: https://blog.51cto.com/u_15902978/6132083

相关文章

  • CentOs7 安装 Sqlserver
    title:CentOs7安装Sqlserver2019date:2023-03-1914:47:00categories:安装教程tags:SqlserverCentOs7安装Sqlserver2019特别鸣谢哔哩哔哩博主:程序员小......
  • SqlServer练习
    /*创建数据库创建数据库包含两个文件(数据库文件和日志文件)*/usemastergo--创建数据库createdatabaseDragonDawsongo--修改数据库字符集alterdatabase......
  • MSSQLSERVER 存储过程debug调试
    每当我们遇到相对稍复杂的业务的时候,都会考虑写在存储过程中,这样相当于一个黑匣,方便管理。 但是如果写的行数太多,如果碰到了问题,凭经验,很难发现问题,那就要用到debug调试......
  • 修复SQLServer 2014支持 TLS 1.2
    修复原因:当把.netcore应用程序部署到linux或docker中去的时候,连接sqlserver数据库可能报错如下:Aconnectionwassuccessfullyestablishedwiththeserver,butthena......
  • oracle,mysql,sqlserver的in的个数限制
    sqlwherein()里面的个数限制:1、oracleOracle9i中个数不能超过256,Oracle10g个数不能超过10002、sqlserver中个数最大只能到5w3、mysql没有限制,只限制了整......
  • sqlserver2008 两种分页操作
    1.有唯一项字段(例如id)SELECTtop分页大小*FROM表名whereidnotin(selecttop(分页大小*(第几页-1))idfrom表名where搜索字段1='aaa'and搜索字段2='bbb'o......
  • SqlServer(三):数据库表调整
    1、修改字段名:altertable表名renamecolumnAtoB2、修改字段类型:altertable表名altercolumn字段名typenotnull3、修改字段默认值altertable表名addde......
  • Sqlserver中使用ISNULL、CAST、CASE完成对jsTree数据的查询
    场景在上面中使用的查询jsTree数据的语句为:SELECTid,ISNULL(CAST(pidASVARCHAR(50)),CAST('#'ASVARCHAR(50)))parent,icon,text,num,org_class......
  • SQLServer2016 AlwaysOn数据库重新加入可用性组
    SQLServer2016AlwaysOn架构,主副本SQLServer服务重启  SQLServer主副本SQLServer重启服务之后,AlwaysOn......
  • SQLSERVER单机安装配置
    安装配置SQLserver2017版本软件包mssql-server-14.0.3238.1-19.x86_64.rpmmssql-tools-17.4.1.1-1.x86_64.rpmmsodbcsql-13.1.9.2-1.x86_64.rpmmsodbcsql17-17.4.2.1-1.x86......