判断字段是否被更新 新旧数据写入Audit Log表中
GO
EXECUTE sp_executesql @sql,
@O OUTPUT;
SET ANSI_PADDING ON
EXEC(EXECUTE)函数访问INSERTED或DELETED的内部临时触发表
[CreateDate] [datetime] NOT NULL,
GO
Insus.NET解决这个问题,只有创建另外一个表,将存储用户决定要跟踪的表,以及这个表中需要跟踪的字段。
)
VALUES
[Audit_nbr] ASC
([AuditType],[TableName],[FieldName],[OldValue],[NewValue],[UserName])
) ON [PRIMARY]
INSERT INTO [dbo].[Audit]
EXECUTE [dbo].[usp_Audit_Insert] 'U','<tableName>','<fieldName>',@O,@N,@UserName
IF (ISNULL(@N,0) <> ISNULL(@O,0))
SET ANSI_NULLS ON
AS
在触发器中访问INSERTED或DELETED的内部临时触发表,会得一个异常invalid object name 'inserted' 或是invalid object name 'deleted' ,解决此问题,可以参考这篇:
[NewValue] [nvarchar](4000) NULL,
下面为表更新触发器(部分),有注释:
SET ANSI_NULLS ON
[AuditType] [char](1) NOT NULL,
解决是谁更新数据,是使用这个方法:在SQL触发器或存储过程中获取在程序登录的用户
Audit
@TableName [nvarchar](128),
@FieldName [nvarchar](128),
GO
复制代码 代码如下:
GO
usp_Audit_Insert
接下来,为跟踪表写一个更新Trigger触发器。
ALTER TABLE [dbo].[Audit] ADD DEFAULT (getdate()) FOR [CreateDate]
[Audit_nbr] [int] IDENTITY(1,1) NOT NULL,
N'@O DECIMAL(18,0) OUTPUT',
@AuditType [char](1),
SET QUOTED_IDENTIFIER ON
GO
@N OUTPUT;
(@AuditType,@TableName,@FieldName,@OldValue,@NewValue,@UserName)
--@N和@O两个变量,一个存储更新数据值,一个为原有数据值
ALTER TABLE [dbo].[Audit] WITH CHECK ADD CHECK (([AuditType]='D' OR [AuditType]='U' OR [AuditType]='I'))
--@I变量是用户需要跟踪的字段
@OldValue [nvarchar](4000),
CREATE TABLE [dbo].[Audit](
[OldValue] [nvarchar](4000) NULL,
复制代码 代码如下:
上面代码还有一个存储过程,原因是如果多表或是一个表有更新或是删除需要把跟踪的数据插入Audit Log表中时,为了更好维护与代码冗余,因此把插入Audit Log表的过程,写成一个存储过程:EXECUTE sp_executesql @sql,
(
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
PRIMARY KEY CLUSTERED
SET @sql = N'SELECT @O = ['+ CONVERT(NVARCHAR(MAX),@I) +'] FROM #deleted'
GO
@NewValue [nvarchar](4000),
[FieldName] [nvarchar](128) NULL,
GO
--执行动态SQL语句。
[TableName] [nvarchar](128) NOT NULL,
[UserName] [nvarchar](128) NULL,
ALTER PROCEDURE [dbo].[usp_Audit_Insert]
--下面SQL代码,是从deleted表中获取原来数据值。
SET ANSI_PADDING OFF
--对比两个数据值,更新值与原有值,如果不一样,把数据插入Audit Log表中。
还要创建另外一个表[Audit],就是存储跟踪记录的表:
@UserName [nvarchar](128)
复制代码 代码如下:
GON'@N DECIMAL(18,0) OUTPUT',
DECLARE @sql NVARCHAR(MAX),@N DECIMAL(18,0),@O DECIMAL(18,0)
GO
SET @sql = N'SELECT @N = ['+ CONVERT(NVARCHAR(MAX),@I) +'] FROM #inserted'
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/sql/mssql/1310.shtml
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
SQL基本教程之行转列Pivo
时间:2021-01-20
-
region from hr.Employees union
时间:2021-01-20
-
有时候需要调整用户权限
时间:2021-01-19
-
(但使用 ORDER BY 子句并不
时间:2021-01-19
-
RAND()*10000)insert into Detail
时间:2021-01-19
-
OR 运算符:在两侧的查询
时间:2021-01-19
-
放假之前老大跟我提起了
时间:2021-01-19
-
数据库的运维计策剧本篇
时间:2021-01-19
热门文章
-
4.与聚合函数和 GROUP BY 子句有关的常见错
时间:2021-01-19
-
SQL Server安全(11/11):审核(Auditing)
时间:2021-01-09
-
sqlserver中查询横表变竖表的sql语句简析
时间:2020-12-08
-
SQL Server简单模式下误删除堆表记录恢复方
时间:2020-12-12
-
关于SQL Server查询语句的使用
时间:2020-12-13
-
MSSQL教程_mssql数据库教程_MSSQL基础教程_第
时间:2020-12-13
-
jdbc连接sql server数据库问题分析
时间:2020-12-10
-
详解SQL游标的用法
时间:2020-12-27
-
sql server 关于设置null的一些建议
时间:2020-12-28
-
mssql关于一个表格结构的另外一种显示(表
时间:2020-12-11
