关于触发器捕获数据异动

  1 -- =============================================
  2 -- Author:        <华仔>
  3 -- Create date: <2016,5,20>
  4 -- Description:    <元宝&分数异动日志>
  5 -- 维护日志:
  6 -- =============================================
  7 ALTER TRIGGER [dbo].[trGameScoreInfo_Change]
  8    ON [dbo].[GameScoreInfo]
  9    AFTER UPDATE
 10 AS
 11     SET NOCOUNT ON;
 12
 13     DECLARE @Gold INT,@Score INT,@InsureScore INT,@InsureGold INT
 14     SELECT @Score = MAX(CASE WHEN New.Score = Old.Score  THEN 0 ELSE 1 END)
 15         ,@InsureScore = MAX(CASE WHEN New.InsureScore = Old.InsureScore  THEN 0 ELSE 1 END)
 16         ,@Gold = MAX(CASE WHEN New.Gold = Old.Gold THEN 0 ELSE 1 END)
 17         ,@InsureGold = MAX(CASE WHEN New.InsureGold = Old.InsureGold THEN 0 ELSE 1 END)
 18     FROM Deleted AS Old JOIN Inserted AS New ON New.UserID = Old.UserID
 19
 20     BEGIN TRY
 21     BEGIN TRAN -- 事务
 22     IF @Gold = 1
 23     BEGIN
 24         CREATE TABLE #Gold
 25         (
 26             [EventType] NVARCHAR(30),
 27             [Parameters] INT,
 28             [EventInfo] NVARCHAR(255)
 29         )
 30         INSERT #Gold EXEC(‘DBCC INPUTBUFFER (‘+@@SPID+‘)‘)
 31         INSERT dbo.GameScoreInfoChange
 32         (
 33             [ChangeUserID],
 34             [ChangeColumn],
 35             [ChangeTime],
 36             [OldColumn],
 37             [NewColumn],
 38             [EventInfo]
 39         )
 40         SELECT Old.UserID,‘Gold‘,GETDATE(),Old.Gold,New.Gold
 41             ,(SELECT TOP 1 [EventType] +‘ | ‘+ CONVERT(NVARCHAR(5),[Parameters]) +‘ | ‘+ [EventInfo] FROM #Gold)
 42         FROM Deleted Old JOIN Inserted New ON New.UserID = Old.UserID AND New.Gold <> Old.Gold
 43     END
 44
 45     IF @InsureGold = 1
 46     BEGIN
 47         CREATE TABLE #InsureGold
 48         (
 49             [EventType] NVARCHAR(30),
 50             [Parameters] INT,
 51             [EventInfo] NVARCHAR(255)
 52         )
 53         INSERT #InsureGold EXEC(‘DBCC INPUTBUFFER (‘+@@SPID+‘)‘)
 54         INSERT dbo.GameScoreInfoChange
 55         (
 56             [ChangeUserID],
 57             [ChangeColumn],
 58             [ChangeTime],
 59             [OldColumn],
 60             [NewColumn],
 61             [EventInfo]
 62         )
 63         SELECT Old.UserID,‘InsureGold‘,GETDATE(),Old.InsureGold,New.InsureGold
 64             ,(SELECT TOP 1 [EventType] +‘ | ‘+ CONVERT(NVARCHAR(5),[Parameters]) +‘ | ‘+ [EventInfo] FROM #InsureGold)
 65         FROM Deleted Old JOIN Inserted New ON New.UserID = Old.UserID AND New.InsureGold <> Old.InsureGold
 66     END
 67
 68     IF @Score = 1
 69     BEGIN
 70         CREATE TABLE #Score
 71         (
 72             [EventType] NVARCHAR(30),
 73             [Parameters] INT,
 74             [EventInfo] NVARCHAR(255)
 75         )
 76         INSERT #Score EXEC(‘DBCC INPUTBUFFER (‘+@@SPID+‘)‘)
 77         INSERT dbo.GameScoreInfoChange
 78         (
 79             [ChangeUserID],
 80             [ChangeColumn],
 81             [ChangeTime],
 82             [OldColumn],
 83             [NewColumn],
 84             [EventInfo]
 85         )
 86         SELECT Old.UserID,‘Score‘,GETDATE(),Old.Score,New.Score
 87             ,(SELECT TOP 1 [EventType] +‘ | ‘+ CONVERT(NVARCHAR(5),[Parameters]) +‘ | ‘+ [EventInfo] FROM #Score)
 88         FROM Deleted Old JOIN Inserted New ON New.UserID = Old.UserID AND New.Score <> Old.Score
 89     END
 90
 91     IF @InsureScore = 1
 92     BEGIN
 93         CREATE TABLE #InsureScore
 94         (
 95             [EventType] NVARCHAR(30),
 96             [Parameters] INT,
 97             [EventInfo] NVARCHAR(255)
 98         )
 99         INSERT #InsureScore EXEC(‘DBCC INPUTBUFFER (‘+@@SPID+‘)‘)
100         INSERT dbo.GameScoreInfoChange
101         (
102             [ChangeUserID],
103             [ChangeColumn],
104             [ChangeTime],
105             [OldColumn],
106             [NewColumn],
107             [EventInfo]
108         )
109         SELECT Old.UserID,‘InsureScore‘,GETDATE(),Old.InsureScore,New.InsureScore
110             ,(SELECT TOP 1 [EventType] +‘ | ‘+ CONVERT(NVARCHAR(5),[Parameters]) +‘ | ‘+ [EventInfo] FROM #InsureScore)
111         FROM Deleted Old JOIN Inserted New ON New.UserID = Old.UserID AND New.InsureScore <> Old.InsureScore
112     END
113
114     COMMIT TRAN -- 提交事务
115     END TRY -- 结束捕获
116     BEGIN CATCH --错误表述
117     ROLLBACK TRAN -- 回滚事务
118         --SELECT CONVERT(CHAR(23),GETDATE(),21)+‘->‘+‘QPTreasureDB.trGameScoreInfo_Change‘+‘->‘+ERROR_MESSAGE()
119         INSERT INTO [QPAccountsDB].[dbo].[QA_ErrorLog]
120             ([ErrorNumber]
121             ,[ErrorSeverity]
122             ,[ErrorState]
123             ,[ErrorProcedure]
124             ,[ErrorLine]
125             ,[ErrorMessage]
126             ,[ErrorTime])
127         SELECT ERROR_NUMBER()
128             ,ERROR_SEVERITY()
129             ,ERROR_STATE()
130             ,‘QPTreasureDB.trGameScoreInfo_Change‘
131             ,ERROR_LINE()
132             ,ERROR_MESSAGE()
133             ,GETDATE()
134     END CATCH -- 结束表述
135
136
137     

时间: 2024-10-12 16:29:21

关于触发器捕获数据异动的相关文章

Python多进程爬虫东方财富盘口异动数据+Python读写Mysql与Pandas读写Mysql效率对比

先上个图看下网页版数据.mysql结构化数据 通过Python读写mysql执行时间为:1477s,而通过Pandas读写mysql执行时间为:47s,方法2速度几乎是方法1的30倍.在于IO读写上,Python多线程显得非常鸡肋,具体分析可参考:https://cuiqingcai.com/3325.html 1.Python读写Mysql # -*- coding: utf-8 -*- import pandas as pd import tushare as ts import pymys

两个文本框异动任何一个能即时更新计算结果

在GridView控件中,有两个文本框,用户更改某一个文本框的值,能即时计算结果.Insus.NET列举一个小例子,来演示些功能.先创建一个对象(类): 在网页中,创建一个集合,假设说,一张采购单有多个物品组件,这样说,采购单就是一个集合,不过些例,只是采购一个物品. 把上面的集合,绑定给GridView数据控件,绑定前,先写Html markup,下划线的部分就是重点部位. 开始在cs绑定数据给GridView控件: 下面来写写OnRowCreated="GridViewPO_RowCreat

SQL Server如何用触发器捕获DML操作的会话信息

原文:SQL Server如何用触发器捕获DML操作的会话信息 需求背景 上周遇到了这样一个需求,维护人员发现一个表的数据经常被修改,由于历史原因:文档缺少:以及维护人员的经常变更,导致他们对系统也业务也不完全熟悉,他们也不完全清楚哪些系统和应用程序会对这个表的数据进行操作.现在他们想找出有哪些服务器,哪些应用程序会对这个表进行INSERT.UPDATE操作.那么问题来了,怎么去解决这个问题呢? 解决方案 由于数据库版本是标准版,我们选择了使用触发器来捕获进行DML操作的会话的相关信息,例如,H

winPcap_6_不用回调方法捕获数据包

用 pcap_next_ex() 函数代替 _5_ 中的 pcap_loop()函数: pcap_loop()函数是基于回调的原理来进行数据捕获,这是一种精妙的方法,并且在某些场合中,它是一种很好的选择. 然而,处理回调有时候并不实用 -- 它会增加程序的复杂度,特别是在拥有多线程的C++程序中. 可以通过直接调用pcap_next_ex() 函数来获得一个数据包 -- 只有当编程人员使用了 pcap_next_ex() 函数才能收到数据包. 这个函数的参数和捕获回调函数的参数是一样的 -- 它

winPcap_5_打开适配器并捕获数据包

知道如何获取适配器的信息了,那我们就开始一项更具意义的工作,打开适配器并捕获数据包.编写一个程序,将每一个通过适配器的数据包打印出来. 打开设备的函数是 pcap_open(). (Open a generic source in order to capture / send (WinPcap only) traffic.) pcap_t* pcap_open ( const char * source, int snaplen, int flags, int read_timeout, st

Winpcap笔记3之打开适配器并捕获数据包

上一讲中知道了如何获取适配的信息,这一将我们讲写一个程序蒋每一个通过适配器的数据包打印出来. 打开设备的函数是pcap_open().函数原型是 pcap_t* pcap_open(const char* source,int snaplen,int flags,int read_timeout,struct pcap_rmtauth *auth,char * errbuf):' pcap_rmatauth { int type. char *username;;//Zero-terminate

Winpcap笔记4之不用回调函数捕获数据包

函数1: pcap_next_ex(pcap_t*                       p, struct pcap_pkthdr**   pkt_header, const u_char*             pkt_data ) 从一个网络接口或离线捕获方式(例如读文件)读取一个数据包.该函数被用来重新获得下一个可用的数据包,没有使用libpcap提供的传统的回调方法.pcap_next_ex用指向头和下一个被捕获的数据包的指针为pkt_header和pkt_data参数赋值.

转 Android智能手机上捕获数据包

如何在Android智能手机上捕获数据包? 本文由CSDN-蚍蜉撼青松[主页:http://blog.csdn.net/howeverpf]原创,转载请注明出处! 当前Android系统越来越流行,无论是对于安卓应用的开发人员,还是对于网络安全的研究人员,都有可能需要掌握捕获Android应用通信数据包的方法.根据技术手段不同,常用的抓包方法分两类,一类是通过Android智能移动终端所接入的上层网络设备或线路获取数据流,另一类则是直接在Android移动终端上监听数据流.本文主要探讨第二类方法

打开适配器并捕获数据包

得到适配器的具体信息就可以抓取信息了. 抓取信息之前应该介绍一个核心的函数:pcap_open_live() (在之前的版本用的是pcap_open()这个函数) pcap_t* pcap_open_live(char* device, int snaplen, int promisc, int to_ms, char* ebuf) 原文是这样描述的 pcap_t* pcap_open_live(char* device, int snaplen, int promisc, int to_ms,