2012-02-11 42 views
0

有没有什么方法可以找出是否插入新的记录,而不是在sql server 2005中写入触发器(它可以是tsql或java ...) 由于供应商是不允许正确触发那里DB ... 也如何生成一个文件与新插入的行数据..是bcp一个很好的解决方案??SQL Server 2005知道新记录被插入

+0

时间戳是不够的?或者是一个标志:'new_from_last_check位默认0' – danihp 2012-02-11 20:13:50

回答

0

我会建议一个最佳实践,可能也会帮助你在这里。如果限制更新和插入仅通过存储过程,则可以使用该过程写出审计记录或仅更新时间/日期字段。

0

该表是否具有自动增量主键或createDate列?您可以编写定期唤醒的cron作业,并查询自上次运行cron作业以来是否有新的命中数据库。

+0

CDC会帮忙?我在2008年获得链接和教程,但我正在使用SQL Server 2005 .... – paramupk 2012-02-15 03:26:29

1

您可以定义一个审计表,然后将OUTPUT命令添加到您的INPUT或UPDATE语句(DELETE也是,btw)。

create table fab4 (id int identity(1,1),FName varchar(80)); 
create table fab4_audit (act varchar(10),id int, FName_old varchar(80), FName_new varchar(80), ts datetime not null default(getdate())); 

-- insert 
insert into fab4(FName) 
output 
'INSERTED' 
, inserted.* 
into fab4_audit([act],id,FName_new) 
select 'John' union all 
select 'Paul' union all 
select 'George' union all 
select 'Ringo'; 
go 

-- update 
update f 
set FName='Walrus' 
output 
'UPDATED' 
, inserted.id 
, deleted.FName 
, inserted.FName 
into fab4_audit([act],id,FName_old,FName_new) 
from fab4 f 
where FName='Paul'; 

-- delete 
delete f 
output 
'DELETED' 
, deleted.id 
, deleted.FName 
into fab4_audit([act],id,FName_old) 
from fab4 f 
where FName in ('John','George'); 
go 

select * from fab4; 
select * from fab4_audit; 
go 
0

我想你需要定义“有没有什么办法来确定是否插入新的记录,而不是写入触发器”。触发器基本上是SQL中的事件处理程序。那么你是否想要有一种触发器,只要将新行插入到表中就会触发?如果是这样,答案是肯定的,它被称为SQL Server通知服务。

这里是beginners article,但我相信你可以只是谷歌“SQL服务器通知”,并得到吨的结果。

这是另一篇好文章:Using SqlDependency To Monitor SQL Database Changes

+0

CDC将帮助?我在2008年获得链接和教程,但我正在使用sql server 2005. – paramupk 2012-02-20 11:19:18

+0

这是SqlDependency for 2005/VS2005的一个。 http://www.codeproject.com/Articles/12335/Using-SqlDependency-for-data-change-events – 2012-02-21 15:42:46