CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

请问怎样在系统表中建立触发器!

楼主dragon432503(dragon)2005-05-09 11:58:12 在 MS-SQL Server / 基础类 提问

我想在syscolumns表中建立触发器,当修改数据库表列时自动将列表、类型等信息更新到我指定的的数据表中去,可系统报229错误禁止创建,不知各位有无可行的方法解决,谢谢! 问题点数:100、回复次数:8Top

1 楼yjzhg(执著)回复于 2005-05-09 11:58:45 得分 0

UPTop

2 楼yesyesyes()回复于 2005-05-09 12:44:57 得分 30

微软说:  
   
  由于   SQL   Server   不支持系统表中的用户定义触发器,因此建议不要在系统表中创建用户定义触发器。  
   
  Top

3 楼paoluo(一天到晚游泳的鱼)回复于 2005-05-09 14:09:34 得分 40

SQL帮助中有以下说明:  
   
  触发器限制  
  CREATE   TRIGGER   必须是批处理中的第一条语句,并且只能应用到一个表中。    
   
  触发器只能在当前的数据库中创建,不过触发器可以引用当前数据库的外部对象。    
   
  如果指定触发器所有者名称以限定触发器,请以相同的方式限定表名。    
   
  在同一条   CREATE   TRIGGER   语句中,可以为多种用户操作(如   INSERT   和   UPDATE)定义相同的触发器操作。    
   
  如果一个表的外键在   DELETE/UPDATE   操作上定义了级联,则不能在该表上定义   INSTEAD   OF   DELETE/UPDATE   触发器。  
   
  在触发器内可以指定任意的   SET   语句。所选择的   SET   选项在触发器执行期间有效,并在触发器执行完后恢复到以前的设置。  
   
  与使用存储过程一样,当触发器激发时,将向调用应用程序返回结果。若要避免由于触发器激发而向应用程序返回结果,请不要包含返回结果的   SELECT   语句,也不要包含在触发器中进行变量赋值的语句。包含向用户返回结果的   SELECT   语句或进行变量赋值的语句的触发器需要特殊处理;这些返回的结果必须写入允许修改触发器表的每个应用程序中。如果必须在触发器中进行变量赋值,则应该在触发器的开头使用   SET   NOCOUNT   语句以避免返回任何结果集。    
   
  DELETE   触发器不能捕获   TRUNCATE   TABLE   语句。尽管   TRUNCATE   TABLE   语句实际上是没有   WHERE   子句的   DELETE(它删除所有行),但它是无日志记录的,因而不能执行触发器。因为   TRUNCATE   TABLE   语句的权限默认授予表所有者且不可转让,所以只有表所有者才需要考虑无意中用   TRUNCATE   TABLE   语句规避   DELETE   触发器的问题。  
   
  无论有日志记录还是无日志记录,WRITETEXT   语句都不激活触发器。  
   
  触发器中不允许以下   Transact-SQL   语句:  
   
  ALTER   DATABASECREATE   DATABASEDISK   INITDISK   RESIZEDROP   DATABASELOAD   DATABASELOAD   LOGRECONFIGURERESTORE   DATABASERESTORE   LOG      
   
   
  说明     由于   SQL   Server   不支持系统表中的用户定义触发器,因此建议不要在系统表中创建用户定义触发器。Top

4 楼chinacheng07(軒尼詩VSOP)回复于 2005-05-09 14:35:34 得分 0

學習Top

5 楼dragon432503(dragon)回复于 2005-05-09 15:01:54 得分 0

我试着用下面的方法创建了触发器,但去发现我修改表的列时却不能触发触发器,但手工改动syscolumns表却可以,晕!  
   
  sp_configure   'allow   updates',   1   reconfigure   with   override  
  go  
  update   sysobjects   set   xtype='U'   where   Name='syscolumns'  
  go  
  CREATE   TRIGGER   Insert_AppTableField   ON   [dbo].[syscolumns]    
  FOR   INSERT  
  AS  
      Insert   Into   AppTableField   (TableName,FieldName)  
      SELECT   object_name(ID),Name    
      FROM   INSERTED  
   
  go  
  update   sysobjects   set   xtype='S'   where   Name='syscolumns'  
  go  
  sp_configure   'allow   updates',   0   reconfigure   with   override  
   
  既然无法支持用户定义的触发器,那有没有别的方法实现呢?Top

6 楼dragon432503(dragon)回复于 2005-05-11 09:00:13 得分 0

各位,有没有好的方法解决呢!Top

7 楼zjcxc(邹建)回复于 2005-05-11 09:05:14 得分 30

别想了,系统表不支持定义触发器.Top

8 楼zjcxc(邹建)回复于 2005-05-11 09:06:40 得分 0

你可以反过来处理,不允许直接建立表,只能在你的应用程序中建立表,你的应用程序直接建表和维护记录表信息的自定义表.Top

相关问题

  • 表层触发器
  • 表的触发器
  • 用触发器更新子表对应的数据,该怎么建立这个触发器呢?help me.
  • 关于为系统表创建触发器的问题
  • 触发器中可不可以为inserted表 和 deleted 表建立索引 ?
  • 》》》》》请问如何对一个含有text字段的表建立insert触发器
  • 急!!!Sybase中建立多表多触发器问题....分不够加
  • 关于建立触发器问题!!!
  • 如何建立时间触发器??
  • 在进货表上建立触发器 使得库存表数据自动增加 在线==

关键词

  • 语句
  • 应用程序
  • 系统
  • 用户
  • 数据库
  • 执行
  • 触发器
  • 表
  • syscolumns
  • 用户定义

得分解答快速导航

  • 帖主:dragon432503
  • yesyesyes
  • paoluo
  • zjcxc

相关链接

  • SQL Server类图书

广告也精彩

反馈

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