SQLServer2000中,触发器到底是否能建在视图上吗?谢谢

tasman 2003-03-12 09:21:21
我写了一个触发器,内容如下,可就是报错
题目原意是:创建一个名为UpdStartDt的触发器,它将反映任何在cruise_book表和customer表中的开始日期的更改。
题目对大家来说不是很难,小弟刚刚接触SQLServer,不明之处,望各位高手赐教。

-- Create trigger 'UpdStartDt'
create view cruise_book_customer
as
select cruise_book.cruise_cd as cruise_book_code,
cruise_book.start_dt as cruise_book_start_date,
customer.start_dt as customer_start_date
from cruise_book, customer
where cruise_book.cruise_cd = customer.cruise_cd
go

create trigger UpdStartDt
on cruise_book_customer
for update
as
begin
if update(cruise_book_start_date)
print 'Start_date of cruise_book has modified!'
if update(customer_start_date)
print 'Start_date of customer has modified!'
end
go
...全文
861 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我同意 pengdali(大力) 的看法,在SQLSERVER7中触发器是不能建在视图上的,
但SQLSERVER2000可以它分为After,Instead of两种类型
springflying 2003-03-15
  • 打赏
  • 举报
回复
我想发表我的看法:你是在两个表上定义的视图,所以你要插入视图时,必须更新两个表,所以这两个表的更新就应该定义在一个事务中,要么都更新成功,要么都不更新
所以我认为应该改为:
CREATE TRIGGER 名 on 视图
INSTEAD OF INSERT
AS
BEGIN
DECLARE @InsertError1 int
DECLARE @InsertError2 int
BEGIN TRAN
INSERT INTO 表1
SELECT name1,name2
FROM inserted
SELECT @InsertError1 = @@Error
INSERT INTO 表2
SELECT name3,name4
FROM inserted
SELECT @InsertError2 = @@Error
IF @InsertError1 = 0 AND @InsertError2 = 0
COMMIT TRAN
ELSE
ROLLBACK TRAN

END
linghuchonglzq2000 2003-03-14
  • 打赏
  • 举报
回复
收藏ing...
chpeng 2003-03-13
  • 打赏
  • 举报
回复
呵呵,视图如果关联多个表本身就不允许(除查询外的操作的),除非是单个表的视图
liuyunfeidu 2003-03-13
  • 打赏
  • 举报
回复
视图不是实际存在的表,怎么可能有UPDATE操作那???既然没有UPDATE操作,那么关于它的触发器又有什么用那?至于INSTEAD OF是否可以用在视图上,我不清楚啊。因为我也没有接触过啊。不过楼主想在UPDATE上建立触发器是绝对不可能的。如果你一定要这么做的话,不如建立临时表啊。不过这样增加系统的空间开销和运行的速度及复杂性。
enhydraboy 2003-03-13
  • 打赏
  • 举报
回复
Instead of 就是建在视图上的。
tasman 2003-03-13
  • 打赏
  • 举报
回复
结!
tasman 2003-03-13
  • 打赏
  • 举报
回复
谢谢各位!!
czzw 2003-03-12
  • 打赏
  • 举报
回复
触发器只能建立在实际表上,视图上是没有的
pengdali 2003-03-12
  • 打赏
  • 举报
回复
CREATE TRIGGER 名 on 视图
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO 表1
SELECT name1,name2
FROM inserted
INSERT INTO 表2
SELECT name3,name4
FROM inserted

END
pengdali 2003-03-12
  • 打赏
  • 举报
回复
INSTEAD OF
该触发器代替触发操作执行。可在表和视图上指定 INSTEAD OF 触发器。只能为每个触发操作(INSERT、UPDATE 和 DELETE)定义一个 INSTEAD OF 触发器。INSTEAD OF 触发器可用于对 INSERT 和 UPDATE 语句中提供的数据值执行增强的完整性检查。INSTEAD OF 触发器还允许指定某些操作,使一般不支持更新的视图可以被更新。
pengdali 2003-03-12
  • 打赏
  • 举报
回复
create view cruise_book_customer
as
select cruise_book.cruise_cd as cruise_book_code,
cruise_book.start_dt as cruise_book_start_date,
customer.start_dt as customer_start_date
from cruise_book, customer
where cruise_book.cruise_cd = customer.cruise_cd
go

create trigger UpdStartDt
on cruise_book_customer
INSTEAD OF update
as
begin
if update(cruise_book_start_date)
print 'Start_date of cruise_book has modified!'
if update(customer_start_date)
print 'Start_date of customer has modified!'
end
go
tasman 2003-03-12
  • 打赏
  • 举报
回复
我的原意是:因为反映两个表,所以我先建一个视图,然后再该视图上进行操作。谢谢大家

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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