加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sqlserver数据库数据追踪例子

发布时间:2020-12-12 13:45:29 所属栏目:MsSql教程 来源:网络整理
导读:SELECT SYS_CHANGE_OPERATION, t.id,t.name from ?changetable(changes ?[需要追踪的表明],[数据库版本号]) ct left join [需要追踪的表明] t on ? t.id = ct.id WHERE ?ct.SYS_CHANGE_VERSION=23 ? 获取数据库当前版本号: SELECT CHANGE_TRACKING_CURRENT_



SELECT SYS_CHANGE_OPERATION,
t.id,t.name from ?changetable(changes ?[需要追踪的表明],[数据库版本号]) ct
left join [需要追踪的表明] t on ? t.id = ct.id
WHERE ?ct.SYS_CHANGE_VERSION<=23 ?


获取数据库当前版本号:

SELECT CHANGE_TRACKING_CURRENT_VERSION() as currentVersion


1.开启数据库追踪和需要追踪的表的追踪



2.开启需要追踪的表追踪



3..创建TableVersionRecord 表 用于保存追踪结果

CREATE TABLE [dbo].[TableVersionRecord](
[ID] [int] IDENTITY(1,1) NOT NULL,
[TableName] [nvarchar](1000) NULL,
[OperationType] [nvarchar](1000) NULL,
[ChangID] [nchar](10) NULL,
[UpdateTime] [datetime] NULL CONSTRAINT [DF_TableVersionRecord_UpdateTime] ?DEFAULT (getdate()),
[VersionNum] [nvarchar](1000) NULL,
?CONSTRAINT [PK_TableVersionRecord] PRIMARY KEY CLUSTERED?
(
[ID] ASC
)WITH (PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


4. 编写追踪存储过程:

CREATE?PROCEDURE [dbo].[GetTableChanged]?
AS
BEGIN
create table #tempTable
(
SYS_CHANGE_VERSION varchar(50),
SYS_CHANGE_OPERATION varchar(10),
ID varchar(50),
)
DECLARE ?@tableName NVARCHAR(100),@sql ?nvarchar(500),@currentVersion nvarchar(100)
DECLARE tableName_Cursor CURSOR FAST_FORWARD FOR ?Select Name FROM SysObjects Where XType='U' and Name !='TableVersionRecord' orDER BY Name
--SELECT @currentVersion = CHANGE_TRACKING_CURRENT_VERSION() as currentVersion


set @currentVersion =CHANGE_TRACKING_CURRENT_VERSION()?
OPEN tableName_Cursor
FETCH NEXT FROM tableName_Cursor INTO @tableName;
WHILE @@FETCH_STATUS = 0
? ? ?BEGIN ?
? ? ? ? ?FETCH NEXT FROM tableName_Cursor INTO @tableName
set @sql ?= 'select '''+@tableName+''' as TableName,SYS_CHANGE_OPERATION as OperationType,
ID as ChangID,getDate() as UpdateTime,'''+ @currentVersion +''' as VersionNum
?from ?changetable(changes '+@tableName+',0) ct'
?print @sql
insert into TableVersionRecord ?EXEC (@sql)
? ? ?END?
CLOSE tableName_Cursor
DEALLOCATE tableName_Cursor
-- select * from #tempTable
SET NOCOUNT ON; ??
? ?--exec (@sql); ?
END



到这里 需要做的事情就完了

后面做个测试: 开始B表没有数据 TableVersionRecord也没有记录 ?? 给B表新加一个数据


给B表新加一条数据:



执行追踪存储过程:




可以看到TableVersionRecord 表中就追踪到了B表中的新增操作:

TableName 表示追踪到的是哪张表

OperationType 是 操作类型 ? ?I 表示新增 ?(后面修改一下看看是不是U)

ChangID ?是B表的主键 ?表示哪条数据变动了

UpdateTime 表示变动的时间

VersionNum 表示表的操作版本(每次对表中的一条数据进行操作都会增加1 ?, ?因为我之前做过测试 所以现在已经是11了)


TableVersionRecord 中的一条数据 表示:

在【UpdateTime】时 ?【TableName】表的【ChangID ?】这条数据 ?进行了【OperationType】操作,当前【TableName】表的版本号是【VersionNum】


好了 完了,

谢谢 点赞


测下修改: ?将字段的值从 上面的 ?b 修改成bb ?后 执行追踪存储过程后 的结果:









参考地址:http://www.cnblogs.com/wubihui/p/3530804.html?


USE [master]

GO /****** Object: ?Database [Test] ? ?Script Date: 2017/5/3 10:42:59 ******/ CREATE DATABASE [Test] ?CONTAINMENT = NONE ?ON ?PRIMARY? ( NAME = N'Test',FILENAME = N'D:Program FilesMicrosoft SQL ServerMSSQL12.MSSQLSERVERMSSQLDATATest.mdf',SIZE = 5120KB,MAXSIZE = UNLIMITED,FILEGROWTH = 1024KB ) ?LOG ON? ( NAME = N'Test_log',FILENAME = N'D:Program FilesMicrosoft SQL ServerMSSQL12.MSSQLSERVERMSSQLDATATest_log.ldf',SIZE = 1024KB,MAXSIZE = 2048GB,FILEGROWTH = 10%) GO ALTER DATABASE [Test] SET COMPATIBILITY_LEVEL = 120 GO IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) begin EXEC [Test].[dbo].[sp_fulltext_database] @action = 'enable' end GO ALTER DATABASE [Test] SET ANSI_NULL_DEFAULT OFF? GO ALTER DATABASE [Test] SET ANSI_NULLS OFF? GO ALTER DATABASE [Test] SET ANSI_PADDING OFF? GO ALTER DATABASE [Test] SET ANSI_WARNINGS OFF? GO ALTER DATABASE [Test] SET ARITHABORT OFF? GO ALTER DATABASE [Test] SET AUTO_CLOSE OFF? GO ALTER DATABASE [Test] SET AUTO_SHRINK OFF? GO ALTER DATABASE [Test] SET AUTO_UPDATE_STATISTICS ON? GO ALTER DATABASE [Test] SET CURSOR_CLOSE_ON_COMMIT OFF? GO ALTER DATABASE [Test] SET CURSOR_DEFAULT ?GLOBAL? GO ALTER DATABASE [Test] SET CONCAT_NULL_YIELDS_NULL OFF? GO ALTER DATABASE [Test] SET NUMERIC_ROUNDABORT OFF? GO ALTER DATABASE [Test] SET QUOTED_IDENTIFIER OFF? GO ALTER DATABASE [Test] SET RECURSIVE_TRIGGERS OFF? GO ALTER DATABASE [Test] SET ?DISABLE_BROKER? GO ALTER DATABASE [Test] SET AUTO_UPDATE_STATISTICS_ASYNC OFF? GO ALTER DATABASE [Test] SET DATE_CORRELATION_OPTIMIZATION OFF? GO ALTER DATABASE [Test] SET TRUSTWORTHY OFF? GO ALTER DATABASE [Test] SET ALLOW_SNAPSHOT_ISOLATION OFF? GO ALTER DATABASE [Test] SET PARAMETERIZATION SIMPLE? GO ALTER DATABASE [Test] SET READ_COMMITTED_SNAPSHOT OFF? GO ALTER DATABASE [Test] SET HONOR_BROKER_PRIORITY OFF? GO ALTER DATABASE [Test] SET RECOVERY FULL? GO ALTER DATABASE [Test] SET ?MULTI_USER? GO ALTER DATABASE [Test] SET PAGE_VERIFY CHECKSUM ? GO ALTER DATABASE [Test] SET DB_CHAINING OFF? GO ALTER DATABASE [Test] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF )? GO ALTER DATABASE [Test] SET TARGET_RECOVERY_TIME = 0 SECONDS? GO ALTER DATABASE [Test] SET DELAYED_DURABILITY = DISABLED? GO EXEC sys.sp_db_vardecimal_storage_format N'Test',N'ON' GO USE [Test] GO /****** Object: ?Table [dbo].[A] ? ?Script Date: 2017/5/3 10:42:59 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[A]( [Aa] [varchar](50) NULL,[Ab] [varchar](50) NULL,[Ac] [varchar](50) NULL,[Ad] [varchar](50) NULL ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO /****** Object: ?Table [dbo].[B] ? ?Script Date: 2017/5/3 10:42:59 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[B]( [Ba] [varchar](50) NULL,[Bb] [varchar](50) NULL,[Bc] [varchar](50) NULL,[Bd] [varchar](50) NULL,[id] [bigint] IDENTITY(1,?CONSTRAINT [PK_B] PRIMARY KEY CLUSTERED? ( [id] ASC )WITH (PAD_INDEX = OFF,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO /****** Object: ?Table [dbo].[From_Table] ? ?Script Date: 2017/5/3 10:42:59 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[From_Table]( [ID] [bigint] IDENTITY(1,[UserName] [varchar](50) NULL,[Password] [varchar](50) NULL,[Sex] [varchar](50) NULL,[Age] [varchar](50) NULL,[Address] [varchar](50) NULL,[Email] [varchar](50) NULL,?CONSTRAINT [PK_From_Table] PRIMARY KEY CLUSTERED? ( [ID] ASC )WITH (PAD_INDEX = OFF,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO /****** Object: ?Table [dbo].[TableVersionRecord] ? ?Script Date: 2017/5/3 10:42:59 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[TableVersionRecord]( [ID] [int] IDENTITY(1,[TableName] [nvarchar](1000) NULL,[OperationType] [nvarchar](1000) NULL,[ChangID] [nchar](10) NULL,[UpdateTime] [datetime] NULL CONSTRAINT [DF_TableVersionRecord_UpdateTime] ?DEFAULT (getdate()),[VersionNum] [nvarchar](1000) NULL,?CONSTRAINT [PK_TableVersionRecord] PRIMARY KEY CLUSTERED? ( [ID] ASC )WITH (PAD_INDEX = OFF,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO /****** Object: ?Table [dbo].[TempB] ? ?Script Date: 2017/5/3 10:42:59 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[TempB]( [Aa] [varchar](50) NULL,[Ad] [varchar](50) NULL,[Ba] [varchar](50) NULL,[Bd] [varchar](50) NULL ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO /****** Object: ?Table [dbo].[To_Table] ? ?Script Date: 2017/5/3 10:42:59 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[To_Table]( [ID] [bigint] IDENTITY(1,?CONSTRAINT [PK_To_Table] PRIMARY KEY CLUSTERED? ( [ID] ASC )WITH (PAD_INDEX = OFF,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO /****** Object: ?StoredProcedure [dbo].[GetTableChanged] ? ?Script Date: 2017/5/3 10:42:59 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[GetTableChanged]? ? ? AS BEGIN create table #tempTable ( SYS_CHANGE_VERSION varchar(50),SYS_CHANGE_OPERATION varchar(10),ID varchar(50),) DECLARE ?@tableName NVARCHAR(100),@currentVersion nvarchar(100) DECLARE tableName_Cursor CURSOR FAST_FORWARD FOR ?Select Name FROM SysObjects Where XType='U' and Name !='TableVersionRecord' orDER BY Name --SELECT @currentVersion = CHANGE_TRACKING_CURRENT_VERSION() as currentVersion set @currentVersion =CHANGE_TRACKING_CURRENT_VERSION()? OPEN tableName_Cursor FETCH NEXT FROM tableName_Cursor INTO @tableName; WHILE @@FETCH_STATUS = 0 ? ? ?BEGIN ? ? ? ? ? ?FETCH NEXT FROM tableName_Cursor INTO @tableName set @sql ?= 'select '''+@tableName+''' as TableName,ID as ChangID,'''+ @currentVersion +''' as VersionNum ?from ?changetable(changes '+@tableName+',0) ct' ?print @sql insert into TableVersionRecord ?EXEC (@sql) ? ? ?END? CLOSE tableName_Cursor DEALLOCATE tableName_Cursor ? select * from #tempTable ?? ?? ? ? SET NOCOUNT ON; ?? ? ?--exec (@sql); ? END --[dbo].[To_Table] -- select * from ?changetable(changes To_Table,0) ct --SYS_CHANGE_VERSION,SYS_CHANGE_OPERATION,ID? GO USE [master] GO ALTER DATABASE [Test] SET ?READ_WRITE? GO

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读