GVKun编程网logo

SQL Server 2008更改数据捕获与审核跟踪中的触发器(sqlserver触发器获取刚更改的数据)

11

以上就是给各位分享SQLServer2008更改数据捕获与审核跟踪中的触发器,其中也会对sqlserver触发器获取刚更改的数据进行解释,同时本文还将给你拓展mssql2000升级到SQLServer

以上就是给各位分享SQL Server 2008更改数据捕获与审核跟踪中的触发器,其中也会对sqlserver触发器获取刚更改的数据进行解释,同时本文还将给你拓展mssql2000升级到SQLServer2005数据库中更改数据架构方法、SQL Server 2000中的触发器使用、SQL Server 2005/2008 触发器的管理和查看、SQL Server 2008 – 帮助编写简单的INSERT触发器等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

SQL Server 2008更改数据捕获与审核跟踪中的触发器(sqlserver触发器获取刚更改的数据)

SQL Server 2008更改数据捕获与审核跟踪中的触发器(sqlserver触发器获取刚更改的数据)

我们在Web应用程序上使用触发器实现了审计跟踪。这些触发器记录字段级别的更新。因此,在一个表中,如果您更改了5个列值,则审计跟踪中将有5条记录,其中每列具有旧值和新值。

最近,我们已升级到SQL
Server2008。我一直在考虑使用新的更改数据捕获功能,因为它以较少的工作量就可以提供非常整齐的行级更新,并且实现起来非常容易。只是想从一直使用变更跟踪的任何警告或任何其他现实世界中有用的信息的人那里获取一些意见。

任何意见将是有益的。

编辑:-http : //technet.microsoft.com/en-
us/magazine/2008.11.sql.aspx?pr=blog

答案1

小编典典

我在WPF应用程序中使用CDC。效果很好,但是我发现了三个问题:

  • 您需要经常备份变更表(我使用MERGE语句将记录添加到历史表中)。因为我发现记录仅在更改表中保留大约2-3天。不要忘记备份 cdc.lsn_time_mapping 表。
  • 您不能在启用CDC的情况下截断表。
  • 禁用cdc并重新启用存在问题(如MS所说,应在新的Service Pack中解决)。我只遇到过一次这个问题,所以并不那么烦人。

http://blogs.technet.com/b/claudia_silva/archive/2010/06/04/cdc-cdc-hangs-
when-i-try-to-disable-
it.aspx

无论如何,CDC是一个非常有用的机制,可以帮助我跟踪数据库上的所有更改。

mssql2000升级到SQLServer2005数据库中更改数据架构方法

mssql2000升级到SQLServer2005数据库中更改数据架构方法

数据库升级到 mssql 2005 了,我对 2005 不熟悉,发现还原 2000 的数据以前的用户名删除不了,报 Microsoft SQL Server错误: 15138。


在网上找到:SQL Server 2005删除用户失败解决方法(15138错误)
Microsoft SQL Server错误: 15138删除对于用户失败,数据库主体在该数据库中拥有架构,无法删除。
删除 对于 用户“*****”失败。 (Microsoft.SqlServer.Smo)

其他信息:

执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)

解决方法一

先删除此用户对应的架构,然后在删除对应的用户
步骤

 代码如下 复制代码
1。SQL SERVER MANAGEMENT STUDIO -> 数据库 -> 安全性 -> 构架,先删除对应的构架
2。SQL SERVER MANAGEMENT STUDIO -> 数据库 -> 安全性 -> 用户,删除对应的用户

解决方法二

–执行如下SQL语句

ALTER AUTHORIZATION ON SCHEMA::db_owner TO dbo;
–然后手动删除就可以了。


在这里又出现构架也删除不了,原因有一个表的构架不是 dbo 了,得改为 dbo 才行。

在数据库testDB中存在架构A及用户A,现将testDB数据库所属的用户由A改为B,同时删除用户A;

架构也由A改为B,删除架构A,操作如下:

1、创建用户B,再创建架构B;

2、将架构A的权限赋给用户B,取消用户A拥有架构A的权限,删除用户A;

3、将数据库的所有属于架构A的对象改为架构B,代码如下:

ALTER SCHEMA [新架构名] TRANSFER 旧架构名.[数据库中的对象表或视图或存储过程]

ALTER SCHEMA [B] TRANSFER A.[对象1]

ALTER SCHEMA [B] TRANSFER A.[对象2]

ALTER SCHEMA [B] TRANSFER A.[对象n] 

而当要更改一个数据库中全部的表或存储过程时,用上面的方法是可以实现,但是速度太慢了,所以写了一个存储过程批量修改:

改存储过程:

 代码如下 复制代码
USE [testDemo]
--
--ALTER SCHEMA slqwell TRANSFER
create table #t (
 ID   int IDENTITY (1,1)     not null, --创建列ID,并且每次新增一条记录就会加1
    procName  varchar(100), 
)
insert into #t(procName)
select   ''dbo.'' +name   from   sysobjects
where   xtype=''P''   and   status>=0
select * from #t
declare @i int
declare @j int
set @j = 1
declare @procName varchar(100)
declare @SchemaTable varchar(200)
while(@j begin
 select @procName=procName from #t where ID=@j
 set @j = @j + 1
 set @SchemaTable = ''ALTER SCHEMA sqlwell TRANSFER '' + @procName
 exec (@SchemaTable)
end
drop table #t

其中原来的架构为代表dbo,先的为sqlwell

要修改表的架构时,只要修改上面的xtype=''P'' 为xtype=''U'' 

SQL Server 2000中的触发器使用

SQL Server 2000中的触发器使用

下面我摘录了SQL Server官方教程中的一段关于触发器的文字,确实有用的一点文字描述。
  可以定义一个无论何时用INSERT语句向表中插入数据时都会执行的触发器。
  当触发INSERT触发器时,新的数据行就会被插入到触发器表和inserted表中。inserted表是一个逻辑表,它包含了已经插入的数据行的一个副本。inserted表包含了INSERT语句中已记录的插入动作。inserted表还允许引用由初始化INSERT语句而产生的日志数据。触发器通过检查inserted表来确定是否执行触发器动作或如何执行它。inserted表中的行总是触发器表中一行或多行的副本。
  日志记录了所有修改数据的动作(INSERT、UPDATE和DELETE语句),但在事务日志中的信息是不可读的。然而,inserted表允许你引用由INSERT语句引起的日志变化,这样就可以将插入数据与发生的变化进行比较,来验证它们或采取进一步的动作。也可以直接引用插入的数据,而不必将它们存储到变量中。
  示例
  在本例中,将创建一个触发器。无论何时订购产品(无论何时向Order Details表中插入一条记录),这个触发器都将更新Products表中的一列(UnitsInStock)。用原来的值减去订购的数量值即为新值。
复制代码 代码如下:

USE Northwind
CREATE TRIGGER OrdDet_Insert
ON [Order Details]
FOR INSERT
AS
UPDATE P SET
UnitsInStock = P.UnitsInStock – I.Quantity
FROM Products AS P INNER JOIN Inserted AS I
ON P.ProductID = I.ProductID

  DELETE触发器的工作过程
  当触发DELETE触发器后,从受影响的表中删除的行将被放置到一个特殊的deleted表中。deleted表是一个逻辑表,它保留已被删除数据行的一个副本。deleted表还允许引用由初始化DELETE语句产生的日志数据。
  使用DELETE触发器时,需要考虑以下的事项和原则:
  ·当某行被添加到deleted表中时,它就不再存在于数据库表中;因此,deleted表和数据库表没有相同的行。
  ·创建deleted表时,空间是从内存中分配的。deleted表总是被存储在高速缓存中。
  ·为DELETE动作定义的触发器并不执行TRUNCATE TABLE语句,原因在于日志不记录TRUNCATE TABLE语句。
  示例
  在本例中,将创建一个触发器,无论何时删除一个产品类别(即从Categories表中删除一条记录),该触发器都会更新Products表中的Discontinued列。所有受影响的产品都标记为1,标示不再使用这些产品了。
复制代码 代码如下:

USE Northwind
CREATE TRIGGER Category_Delete
ON Categories
FOR DELETE
AS
UPDATE P SET Discontinued = 1
FROM Products AS P INNER JOIN deleted AS d
ON P.CategoryID = d.CategoryID

  UPDATE触发器的工作过程
  可将UPDATE语句看成两步操作:即捕获数据前像(before image)的DELETE语句,和捕获数据后像(after image)的INSERT语句。当在定义有触发器的表上执行UPDATE语句时,原始行(前像)被移入到deleted表,更新行(后像)被移入到inserted表。
  触发器检查deleted表和inserted表以及被更新的表,来确定是否更新了多行以及如何执行触发器动作。
  可以使用IF UPDATE语句定义一个监视指定列的数据更新的触发器。这样,就可以让触发器容易的隔离出特定列的活动。当它检测到指定列已经更新时,触发器就会进一步执行适当的动作,例如发出错误信息指出该列不能更新,或者根据新的更新的列值执行一系列的动作语句。
  语法
IF UPDATE (<column_name>)
  例1
  本例阻止用户修改Employees表中的EmployeeID列。
复制代码 代码如下:

USE Northwind
GO
CREATE TRIGGER Employee_Update
ON Employees
FOR UPDATE
AS
IF UPDATE (EmployeeID)
BEGIN
RAISERROR (''Transaction cannot be processed.\
***** Employee ID number cannot be modified.'', 10, 1)
ROLLBACK TRANSACTION
END

  INSTEAD OF触发器的工作过程
  可以在表或视图上指定INSTEAD OF触发器。执行这种触发器就能够替代原始的触发动作。INSTEAD OF触发器扩展了视图更新的类型。对于每一种触发动作(INSERT、UPDATE或 DELETE),每一个表或视图只能有一个INSTEAD OF触发器。
  INSTEAD OF触发器被用于更新那些没有办法通过正常方式更新的视图。例如,通常不能在一个基于连接的视图上进行DELETE操作。然而,可以编写一个INSTEAD OF DELETE触发器来实现删除。上述触发器可以访问那些如果视图是一个真正的表时已经被删除的数据行。将被删除的行存储在一个名为deleted的工作表中,就像AFTER触发器一样。相似地,在UPDATE INSTEAD OF触发器或者INSERT INSTEAD OF触发器中,你可以访问inserted表中的新行。
  不能在带有WITH CHECK OPTION定义的视图中创建INSTEAD OF触发器。
示例
  在本例中,创建了一个德国客户表和一个墨西哥客户表。放置在视图上的INSTEAD OF触发器将把更新操作重新定向到适当的基表上。这时发生的插入是对CustomersGer表的插入而不是对视图的插入。
  创建两个包含客户数据的表:
复制代码 代码如下:

SELECT * INTO CustomersGer FROM Customers WHERE Customers.Country = ''Germany''
SELECT * INTO CustomersMex FROM Customers WHERE Customers.Country = ''Mexico''
GO

  在该数据上创建视图:
复制代码 代码如下:

CREATE VIEW CustomersView AS
SELECT * FROM CustomersGer
UNION
SELECT * FROM CustomersMex
GO

  创建一个在上述视图上的INSTEAD OF触发器:
复制代码 代码如下:

CREATE TRIGGER Customers_Update2
ON CustomersView
INSTEAD OF UPDATE AS
DECLARE @Country nvarchar(15)
SET @Country = (SELECT Country FROM Inserted)
IF @Country = ''Germany''
BEGIN
UPDATE CustomersGer
SET CustomersGer.Phone = Inserted.Phone
FROM CustomersGer JOIN Inserted
ON CustomersGer.CustomerID = Inserted.CustomerID
END
ELSE
IF @Country = ''Mexico''
BEGIN
UPDATE CustomersMex
SET CustomersMex.Phone = Inserted.Phone
FROM CustomersMex JOIN Inserted
ON CustomersMex.CustomerID = Inserted.CustomerID
END

  通过更新视图,测试触发器:
复制代码 代码如下:

UPDATE CustomersView SET Phone = '' 030-007xxxx''
WHERE CustomerID = ''ALFKI''
SELECT CustomerID, Phone FROM CustomersView
WHERE CustomerID = ''ALFKI''
SELECT CustomerID, Phone FROM CustomersGer
WHERE CustomerID = ''ALFKI''

  那么具体的讲,对于多列数据,如何计算方差呢?:
复制代码 代码如下:

CREATE TRIGGER [calT1T2T3] ON dbo.DCLB
FOR INSERT,UPDATE
AS
update P
SET
/**//*
计算方差的触发器
*/
P.T1=(I.P1+I.P2+I.P3+I.P4+I.P5+I.P6),
P.T2=(I.Y1+I.Y2+I.Y3+I.Y4+I.Y5+I.Y6 ),
P.T3=SQRT(P.T1*P.T1+P.T2*P.T2)
FROM DCLB AS P INNER JOIN Inserted AS I
ON P.SID = I.SID

  触发器的使用很方便,而且也很简单,重要的是理解inserted过程。可将UPDATE语句看成两步操作:即捕获数据前像(before image)的DELETE语句,和捕获数据后像(after image)的INSERT语句。当在定义有触发器的表上执行UPDATE语句时,原始行(前像)被移入到deleted表,更新行(后像)被移入到inserted表。触发器检查deleted表和inserted表以及被更新的表,来确定是否更新了多行以及如何执行触发器动作。
您可能感兴趣的文章:
  • 存储过程解密(破解函数,过程,触发器,视图.仅限于SQLSERVER2000)
  • SQL Server 触发器 表的特定字段更新时,触发Update触发器
  • sqlserver 禁用触发器和启用触发器的语句
  • SQLServer触发器创建、删除、修改、查看示例代码
  • 用sql脚本创建sqlserver数据库触发器范例语句
  • SQL Server触发器及触发器中的事务学习
  • sqlserver 触发器教程
  • sqlserver 触发器实例代码
  • sqlserver 触发器学习(实现自动编号)
  • sqlserver中触发器+游标操作实现
  • Sql Server触发器的使用
  • SQL SERVER中各类触发器的完整语法及参数说明
  • SQL Server 触发器实例详解

SQL Server 2005/2008 触发器的管理和查看

SQL Server 2005/2008 触发器的管理和查看

过可视化操作来管理和查看触发器
在 Microsoft SQL Server Management Studio 中,选中某一数据库的某一张表时,在 “对象资源管理器详细” 窗口中有 “触发器” 项。

通过 “触发器” 的右键菜单功能,我们可以新建触发器。如果原来的表中已经存在了触发器,通过双击 “触发器” 项可以查看到具体的触发器,在此处可以执行 修改、删除等操作。

 

1、通过可视化操作来管理和查看触发器
在 Microsoft SQL Server Management Studio 中,选中某一数据库的某一张表时,在 “对象资源管理器详细” 窗口中有 “触发器” 项。
通过 “触发器” 的右键菜单功能,我们可以新建触发器。如果原来的表中已经存在了触发器,通过双击 “触发器” 项可以查看到具体的触发器,在此处可以执行 修改、删除等操作。

2、通过查询分析器来管理和查看触发器
1)查看表中的触发器类型:
sp_helptrigger: 返回对当前数据库的指定表定义的 DML 触发器的类型。sp_helptrigger 不能用于 DDL 触发器。
示例: EXEC sp_helptrigger '' 表名''

2)查看触发器的有关信息:
sp_help: 报告有关数据库对象(sys.sysobjects 兼容视图中列出的所有对象)、用户定义数据类型或某种数据类型的信息。
示例: EXEC sp_help '' 触发器名''

3)显示触发器的定义:
sp_helptext: 显示规则、默认值、未加密的存储过程、用户定义函数、触发器或视图的文本。
示例: EXEC sp_helptext '' 触发器名''

4)查看当前库中所有的触发器:
查询脚本:SELECT * FROM Sysobjects WHERE xtype = ''TR''

5)查看当前库中所有的触发器和与之相对应的表:
查询脚本:SELECT tb2.name AS tableName,tb1.name AS triggerName FROM Sysobjects tb1 JOIN Sysobjects tb2 ON tb1.parent_obj=tb2.id WHERE tb1.type=''TR''

 

SQL Server 2008 – 帮助编写简单的INSERT触发器

SQL Server 2008 – 帮助编写简单的INSERT触发器

这是与Microsoft sql Server 2008.

我有2个表,Employee和EmployeeResult,我试图在EmployeeResult上写一个简单的INSERT触发器,每次INSERT都完成到EmployeeResult中,例如:

(杰克,200,销售)
(简,300,营销)
(约翰,400,工程)

它应该查找名称,部门条目对,如

(杰克,销售),
(简,营销),
(John,Engineering)

在Employee表中,如果此类员工不存在,则应将其插入员工表中.

我有这个与未知数如何修复“???”:

CREATE TRIGGER trig_Update_Employee
ON [EmployeeResult]
FOR INSERT
AS
IF EXISTS (SELECT COUNT(*) FROM Employee WHERE ???)
  BEGIN
   INSERT INTO [Employee] (Name,Department) VALUES (???,???)
  END

请帮忙,谢谢提前

架构:

Employee
--------
Name,varchar(50)
Department,varchar (50)

EmployeeResult
--------------
Name,varchar(50)
Salary,int
Department,varchar (50)

解决方法

您希望利用在触发器上下文中可用的插入逻辑表.它匹配要插入的表的模式,并包括要插入的行(在更新触发器中,您可以分别访问表示新数据和原始数据的插入和删除的逻辑表.)

因此,要插入当前不存在的员工/部门对,您可以尝试以下操作.

CREATE TRIGGER trig_Update_Employee
ON [EmployeeResult]
FOR INSERT
AS
Begin
    Insert into Employee (Name,Department) 
    Select distinct i.Name,i.Department 
    from Inserted i
    Left Join Employee e
    on i.Name = e.Name and i.Department = e.Department
    where e.Name is null
End

关于SQL Server 2008更改数据捕获与审核跟踪中的触发器sqlserver触发器获取刚更改的数据的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于mssql2000升级到SQLServer2005数据库中更改数据架构方法、SQL Server 2000中的触发器使用、SQL Server 2005/2008 触发器的管理和查看、SQL Server 2008 – 帮助编写简单的INSERT触发器等相关内容,可以在本站寻找。

本文标签: