微软说:由于 SQL Server 不支持系统表中的用户定义触发器,因此建议不要在系统表中创建用户定义触发器。
解决方案 »
- (高手急救)SQL2005装完不能用?
- sql“查询分析器”帮助好像有个例子是说用“栈”来实现“父子递归”的,我现在找不到,请各位高手提供一下吧!
- 这段函数为何通不过?
- |M| SQL 导入导出的时候数据库表的主键和自动编号丢失 怎么办
- 老师们好:用select * into tmp from name1 方法生成一个表时,如何生成name1中没有的字段呢?
- SQL提取数字
- 原SQL显示一现有字段,尊请qianjin036a (晴天)秒杀,送分!
- 请问如何用sql语句察看某用户的数据库中有多少表及其名字
- 大家来拿分呀!!!好多分呀!!
- A,B两表结构同,有复合主索引(MB01+MB02),要找出A表中B表未有的数据(以主索引为表达式),应怎样写?,
- 动态添加字段
- 请问: identity(1,1)与identity primary key 的区别是什么?
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 不支持系统表中的用户定义触发器,因此建议不要在系统表中创建用户定义触发器。
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既然无法支持用户定义的触发器,那有没有别的方法实现呢?