200分求Instead of Delete 解发器的解决方法!视图中更新删除数据!阿梁老兄,听说你解决了!能不能帮帮忙 (200分)

  • 主题发起人 主题发起人 ProgramFan
  • 开始时间 开始时间
P

ProgramFan

Unregistered / Unconfirmed
GUEST, unregistred user!
对普通视图(指不含有计算列的)的新建、修改是十分简单的,直接操作就能完成。
但是删除就成了大麻烦。
请问各位大侠有没有好的办法解决删除问题?(即直接删除基表)
为了能够对此视图进行更新、删除操作,我仔细的查看了SQLSERVER 2000 的帮助,得到以下信息:
-----------------------------------------
使用 INSTEAD OF 触发器
可以在表或视图上定义 INSTEAD OF 触发器;然而,INSTEAD OF 触发器对扩展视图能支持的更新类型最有用。
例如,INSTEAD OF 触发器能够提供逻辑以通过视图修改多个基表,或者修改包含以下列的基表:
timestamp 数据类型
计算列 ^^^这是重点
标识列
我在视图上建了一个触发器
CREATE TRIGGER [TriTESTDELInsteadDel] ON [dbo].[TestDel]
INSTEAD OF DELETE
AS
DELETE Table2 where a in (Select a from deleted)
在程序中删除并没有只删除指定的TABLE2中的记录!
在实际使用中发现对视图进行删除操作时触发器并不工作,

我发现在Enterprise Manager->触发器属性中创建任何内容(INSERT或UPDATE或DELETE )
的 INSTEAD 触发器都会报错,
错误信息:错误5:[sql-dmo]代码执行异常错误:EXCEPTION_ACESS_VIOLATION
Q:这个错误是怎么回事?

阿liang
Email DinkySoft@163.com
收到给分!
 
靠,给分,我在QQ上给你解决了。
 
没有得到解决!
 
大家帮我Up一下!
 
是不是用的ADO连接呀?
 
是的ADO连接
 
呵呵,不知道m$是怎么想的,instead触发器和ADO的访问是一对矛盾.
instead是用来把对视图的操作按程序员的意图写到真实表上去的.
ADO有一个噱头是自动把对join表操作写回原表.
所以,你用ADO连一个视图,再用SQL监视看看,所有的SQL语句都被直接作用到了表上,而非视图上.
所以你觉的触发器没有被调用,他确实没有被调用.
如果想他被调用,要直接写作用在视图上的SQL语句,比如updata ViewName set a=11 where ID=1
 
to LeeChange
我试着在TDataSet.Delete中写入
delete ViewName where ID=1
但是不知道怎么嵌入!
难道.net光碟中有一个解决方法难不成也是这样!
 
你在查询分析器中多做些测试,
我做过这样的N次,从来没报过错,SQL还不至于这样烂吧。
 
to xzh2000
我在是企业管理器中,不是查询分析器中,触发器是写在视图上,不信你试试!在企业管理器中
 
to ProgramFan:
找谁试都一样,用ADO肯定会跳过视图,直接用SQL语句吧.
 
我直接用adocommand写入命令!
Delete Table2 where id=xx
但是这样做,DBGrid并不会感知!要通过刷新!
删除后又难定位!
 
呵呵,如果你早知道这个陷阱的话可能就不会选这种方式了.
解决方法很多:用SQL后Refresh数据集,或者干脆不用视图,全部用LookUp字段实现
 
to LeeChange
谢谢你!阿梁,说他已经解决了这个问题,不知道他什么时候能看到我的问题!
如果可以解决的话我通知你!
 
问题总算解决了!谢谢大家!我改用了BetterADO组件!免费的组件!大家可以去下载!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
872
import
I
后退
顶部