以上就是给各位分享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触发器获取刚更改的数据)
- mssql2000升级到SQLServer2005数据库中更改数据架构方法
- SQL Server 2000中的触发器使用
- SQL Server 2005/2008 触发器的管理和查看
- SQL Server 2008 – 帮助编写简单的INSERT触发器
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数据库中更改数据架构方法
数据库升级到 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官方教程中的一段关于触发器的文字,确实有用的一点文字描述。可以定义一个无论何时用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