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

解决方案 »

  1.   

    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 不支持系统表中的用户定义触发器,因此建议不要在系统表中创建用户定义触发器。
      

  2.   

    我试着用下面的方法创建了触发器,但去发现我修改表的列时却不能触发触发器,但手工改动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 INSERTEDgo
    update sysobjects set xtype='S' where Name='syscolumns'
    go
    sp_configure 'allow updates', 0 reconfigure with override既然无法支持用户定义的触发器,那有没有别的方法实现呢?