CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

求一个这样的触发器或储存过程。。。

楼主kenways(kenways)2006-03-12 11:58:06 在 MS-SQL Server / 基础类 提问

数据库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

相关问题

  • 触发器和储存过程
  • 请问ACCESS2000能不能用储存过程和触发器?
  • 触发器怎样调用过程?
  • 关于存储过程和触发器!
  • 存储过程与触发器?
  • 触发器和存储过程
  • 触发器改成存储过程
  • 存储过程及触发器+错误
  • 触发器中调用存储过程?
  • 触发器和存储过程

关键词

  • 用户
  • 触发器
  • elseset
  • quotename
  • 表
  • tmpdb
  • tempdb
  • states
  • cast
  • 删除

得分解答快速导航

  • 帖主:kenways
  • zjcxc
  • filebat
  • flashspider

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo