问问各位有没有这样的需求?

artyyu 2003-09-29 10:12:11
SQL Server 中对视图进行触发器编程
...全文
103 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2003-09-29
  • 打赏
  • 举报
回复
sql 2000才支持.7.0无此功能.

你写的触发器没错,用它就可以实现你的要求.
zjcxc 2003-09-29
  • 打赏
  • 举报
回复
sql 2000才支持.7.0无此功能.

你写的触发器没错,用它就可以实现你的要求.
artyyu 2003-09-29
  • 打赏
  • 举报
回复
写个例子可能很快明白我意思:
CREATE TRIGGER 触发器名 on a视图
INSTEAD OF INSERT
AS
insert into b(id,name)values(1,'yyyyy')
GO

其中b表为其他表与a视图无关,a视图增加记录时,b表也增加记录
如果不对,请写一个例子给我
pengdali 2003-09-29
  • 打赏
  • 举报
回复
这是,替代操作触发器也是操作前触发器。

使用 INSTEAD OF 触发器
INSTEAD OF 触发器替代触发语句的标准操作(INSERT、UPDATE 或 DELETE)。例如,可以定义 INSTEAD OF 触发器在一列或多列上执行错误或值的检查,然后在插入记录之前执行其它操作 例如,当工资表中小时工资列的更新值超过指定值时,可以定义触发器或者产生错误信息并回滚该事务,或者在审核日志中插入新记录(在工资表中插入该记录之前)。有关更多信息,请参见设计 INSTEAD OF 触发器。

artyyu 2003-09-29
  • 打赏
  • 举报
回复
我的需求是这样的:当视图增加记录时,能触发我干别的事(比如,操作别的表),能告诉我怎么做?不胜感谢!
伍子V5 2003-09-29
  • 打赏
  • 举报
回复
触发器执行
如果发生约束侵犯,则永远不会执行 AFTER 触发器,因此这些触发器不能用于任何可能防止约束侵犯的处理。

执行 INSTEAD OF 触发器而不是通常的触发动作。在创建将更改反映到基表的 inserted 和 deleted 表之后,但在执行任何操作之前执行这些触发器。这些触发器在执行任何约束前执行,因此可执行预处理以补充约束操作。

如果某个表上定义的 INSTEAD OF 触发器对该表执行一个通常将再次激发 INSTEAD OF 触发器的语句,则将不递归调用该触发器。相反,将视该表为没有 INSTEAD OF 触发器来处理该语句,并启动约束操作与 AFTER 触发器执行之间的链。例如,如果将触发器定义为一个表的 INSTEAD OF INSERT 触发器,并且该触发器在同一表上执行 INSERT 语句,则由 INSTEAD OF 触发器执行的 INSERT 语句不会再次调用该触发器。该触发器执行的 INSERT 将启动这样的进程,执行约束操作并激发为表定义的任何 AFTER INSERT 触发器。

如果视图上定义的 INSTEAD OF 触发器对该视图执行一个通常将再次激发 INSTEAD OF 触发器的语句,则将不递归调用该触发器。而是将该语句解析为对视图的基础基表的更改。在这种情况下,视图定义必须满足对可更新视图的所有限制。有关可更新视图的定义,请参见通过视图修改数据。例如,如果将触发器定义为某个视图的 INSTEAD OF UPDATE 触发器,并且该触发器执行引用该视图的 UPDATE 语句,则由 INSTEAD OF 触发器执行的 UPDATE 语句不会再次调用该触发器。在处理该触发器对视图执行的 UPDATE 语句时,将视图看作没有 INSTEAD OF 触发器一样对待。UPDATE 更改的列必须解析到单个基表。对基础基表所做的每个修改将启动应用约束和激发为表定义的 AFTER 触发器之间的链。

触发器的性能开销通常很低。运行触发器的时间大部分都用于引用其它表,这些表可以在内存或数据库设备上。Deleted 和 inserted 表总是在内存中。触发器所引用的其它表的位置确定操作所需的时间。



说明 由于存在对性能的潜在负面影响,不推荐在触发器中使用游标。使用基于行集的逻辑而非游标来设计影响多行的触发器。



请参见
artyyu 2003-09-29
  • 打赏
  • 举报
回复
有道理的,
但是INSTEAD OF INSERT 什么意思,为什么不能用 For INSERT
请赐教
pengdali 2003-09-29
  • 打赏
  • 举报
回复
举例:

create table a (a int,aa varchar(100))
create table b (b int,bb varchar(100))
go
create view c
as
select a.*,b.* from a,b where a.a=b.b
go

--测试:
insert c values(1,'aa',1,'bb')
--失败

go
CREATE TRIGGER 名 on c
INSTEAD OF INSERT
AS
BEGIN
INSERT a select a,aa from inserted
INSERT b select b,bb from inserted
END
go

--测试:
insert c values(1,'aa',1,'bb')
artyyu 2003-09-29
  • 打赏
  • 举报
回复
我的数据库是sql 2000,可也是不行呀

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧