请问怎样在系统表中建立触发器!
我想在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




