还是触发器,不懂

use 体育场管理系统
go
create trigger trig_删除客户
on 客户信息
after delete
as
begin
delete from 场地预订信息 where 客户编号 in (select 客户编号 from deleted)
end



错误提示:
  消息 207,级别 16,状态 1,过程 trig_删除客户,第 6 行
列名 '客户编号' 无效。

作者: cj_cheng   发布时间: 2011-06-13

你确定
客户信息
场地预订信息 
这两个表都有客户编号 字段吗

作者: Haiwer   发布时间: 2011-06-13

删除的时候没有客户编号吧?
不是叫编号,或是别的什么?

作者: maco_wang   发布时间: 2011-06-13

客户信息和场地预订信息中肯定有一个不叫客户编号

作者: cd731107   发布时间: 2011-06-13

客户编号在场地预订信息这张表中不?

作者: fredrickhu   发布时间: 2011-06-13

回复1楼:
  场地预订信息里没有客户编号,一定要有吗?我们书上就是这样写的,而且数据库也是从佩带的光盘里拷贝的

作者: cj_cheng   发布时间: 2011-06-13

...
不知道说什么好

场地预订信息里没有客户编号,要么你修改触发器,要么你修改表结构,否则肯定报错

作者: Haiwer   发布时间: 2011-06-13

回复:
    对了,忘了说我这是嵌套触发器,其中“场地预订信息”还与“预订明细”表有触发效果,而“预订明细”表里面有“客户编号”,这样行的通吗?

作者: cj_cheng   发布时间: 2011-06-13

假如 你要按‘客户编号’条件删除‘场地预订信息’表中的信息
是不是‘场地预订信息’表中得有‘客户编号’这个字段?
select 客户编号 from deleted
这张表中的客户编号对应的‘场地预订信息’表 的字段你再仔细看一下
应该不是‘客户编号’字段

作者: chuanzhang5687   发布时间: 2011-06-13

SQL code
delete from 预订明细 where 客户编号 in (select 客户编号 from deleted)
--是这个样子吗?

作者: chuanzhang5687   发布时间: 2011-06-13

缺少字段。 “砖家”鉴定完毕。

作者: falconfei   发布时间: 2011-06-13

引用 6 楼 haiwer 的回复:
...
不知道说什么好

场地预订信息里没有客户编号,要么你修改触发器,要么你修改表结构,否则肯定报错

场地预订信息里没有客户编号,
为什么还这么写 delete from 场地预订信息 where 客户编号?

作者: cd731107   发布时间: 2011-06-13

回复9楼:
  你要问的是“场地预订信息”和“预订明细”之间的触发代码吧,代码是这样的:
  delete from 预订明细
where 订单号 in (select 订单号 from deleted)
  不过“预订明细”里面确实有“客户”可能是编者弄错了,应该是“客户编号”,我查看了属性值,是一样的

作者: cj_cheng   发布时间: 2011-06-13

问题解决了吗?
古语有云,尽信书不如无书。
引用 12 楼 cj_cheng 的回复:
回复9楼:
你要问的是“场地预订信息”和“预订明细”之间的触发代码吧,代码是这样的:
delete from 预订明细
where 订单号 in (select 订单号 from deleted)
不过“预订明细”里面确实有“客户”可能是编者弄错了,应该是“客户编号”,我查看了属性值,是一样的

作者: chuanzhang5687   发布时间: 2011-06-13

回复13楼:
  没有呢,我现在不明白“触发器嵌套”是不是就可以让两个不含相同“属性”的表建立触发结构,只要他们是间接含有相同属性,也就是我上面“7”楼说的那样

作者: cj_cheng   发布时间: 2011-06-13

不好意思帅锅,触发器嵌套不会。
好像触发器的定义是这样的,当对某一表进行诸如UPDATE、 INSERT、 DELETE 这些操作时,SQL Server 就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。 
  触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能: 
(1) 强化约束(Enforce restriction) 
触发器能够实现比CHECK 语句更为复杂的约束。 

(2) 跟踪变化Auditing changes 
触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。 

(3) 级联运行(Cascaded operation)。 
触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。 
(4) 存储过程的调用(Stored procedure invocation)。 
为了响应数据库更新触,发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS( 数据库管理系统)本身之外进行操作。 
  由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(INSERT、 UPDATE、 DELETE)的多个触发器能够对同一种数据操作采取多种不同的处理。 
  总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。 
引用 14 楼 cj_cheng 的回复:
回复13楼:
没有呢,我现在不明白“触发器嵌套”是不是就可以让两个不含相同“属性”的表建立触发结构,只要他们是间接含有相同属性,也就是我上面“7”楼说的那样

作者: chuanzhang5687   发布时间: 2011-06-13