求一个这样的触发器或储存过程。。。
数据库ABC 里的所有用户表(不包括后面说的TMPDB表)如果发生了记录的变化,如:插入,更新,删除时,就向表TMPDB插入对应的数据,TMPDB表字段如下:
TblName(表名),States(标识,0=插入,1=更新,2=删除) ,Indate(日期,自动的getdate)
问题点数:100、回复次数:7Top
1 楼zjcxc(邹建)回复于 2006-03-12 12:17:00 得分 90
-- 如果在数据库中实现, 则需要为每个要记录的用户表写触发器:
create trigger tr_record on 表名
for insert,update,delete
as
if @@rowcount = 0
return
declare @States int
if exists(select * from inserted)
if exists(select * from deleted)
set @States=1
else
set @States=0
else
set @States = 2
insert tempdb(TblName, States)
values('表名', @States)
go
Top
2 楼filebat(Mark)回复于 2006-03-12 12:23:43 得分 5
你通过一个循环+动态SQL语句,
从而对每个用户表分别写inset, delete, update触发器吧
但是这样看起来不是很好, 如果有N张表,就会生成3*N个触发器了。
我建议,你还是再看看,你的需求是否合理吧。
或是用审计吧Top
3 楼flashspider(还没想好)回复于 2006-03-12 12:39:42 得分 5
在每个表上都写一个触发器???Top
4 楼zjcxc(邹建)回复于 2006-03-12 12:41:00 得分 0
是的, 因为触发器都是一样的, 所以你还可以循环所有用户表, 通过代码自动创建.Top
5 楼zjcxc(邹建)回复于 2006-03-12 12:45:23 得分 0
-- 所有表上创建触发器
declare hcforeach cursor global
for
select cast(N'
create trigger '
+cast(quotename('tr_record_'+name) as varchar(8000))
+' on '+cast(quotename(user_name(uid)) as varchar(8000))
+'.'+cast(quotename(name) as varchar(8000))+'
for insert,update,delete
as
if @@rowcount = 0
return
declare @States int
if exists(select * from inserted)
if exists(select * from deleted)
set @States=1
else
set @States=0
else
set @States = 2
insert tempdb(TblName, States)
values('+cast(quotename(name,'''') as varchar(8000))+', @States)
' as varchar(8000))
from dbo.sysobjects
where objectproperty(id, 'isusertable')=1
and name<>'tempdb'
exec sp_msforeach_worker '?'Top
6 楼zjcxc(邹建)回复于 2006-03-12 13:14:02 得分 0
-- 删除所有的触发器.
declare hcforeach cursor global
for
select N'
drop trigger '
+cast(quotename('tr_record_'+name) as varchar(8000))
from dbo.sysobjects
where objectproperty(id, 'isusertable')=1
and name<>'tempdb'
exec sp_msforeach_worker '?'Top
7 楼kenways(kenways)回复于 2006-03-12 16:27:06 得分 0
嗯。可以了,谢谢邹大人Top




