急問﹕PB及觸發器的問題

cbz0660 2005-10-14 10:33:06
各位大蝦﹐我在窗口控件里update一個表時﹐在這個表里寫了觸發器目的是當update,delete,insert時就得update,delete,insert其它的表﹐可當我update窗口里的表時刪除了其它的表里相應的記錄﹐在觸發器里沒有觸發update這個觸發器﹐而是觸發了delete這個觸發器各觸發器代碼如下﹕
CREATE TRIGGER t_update_user ON dbo.c_computer_user
FOR UPDATE
not for replication
AS
set nocount on

declare
@computer_name char(15)

if update(computer_name)

--raiserror('rew',16,1)
-- begin
select @computer_name = computer_name from inserted

if @computer_name <>'' or @computer_name is not null
begin

update c_fitting_dtl set computer_name = @computer_name from c_fitting_dtl a,deleted b where a.computer_name=b.computer_name
update c_software_dtl set computer_name = @computer_name from c_software_dtl a,deleted b where a.computer_name = b.computer_name
update c_internet_url set computer_name = @computer_name from c_internet_url a,deleted b where a.computer_name = b.computer_name
update c_network_dtl set computer_name = @computer_name from c_network_dtl a,deleted b where a.computer_name = b.computer_name
update c_e_mail_apply set computer_name = @computer_name from c_e_mail_apply a,deleted b where a.computer_name = b.computer_name
end
end
set nocount off
/////////////////////////////////////////////////////////////////////////////////////////
CREATE TRIGGER t_delete_user ON dbo.c_computer_user
FOR DELETE
not for replication
AS
set nocount on
declare
@computer_name char(20)
select @computer_name = computer_name from deleted
delete from c_fitting_dtl
where computer_name = @computer_name
delete from c_software_dtl
where computer_name = @computer_name
delete from c_internet_url
where computer_name = @computer_name
delete from c_network_dtl
where computer_name = @computer_name
delete from c_e_mail_apply
where computer_name = @computer_name
set nocount off
///////////////////////////////////////////////////////////////////////////////////
CREATE TRIGGER t_insert_user ON dbo.c_computer_user
FOR insert
not for replication
AS

set nocount on
declare @error varchar(400),
@row int,
@computer_name varchar(20),
@user varchar(15),
@seq_no int,
@seq int
select @row = count(*) from c_software_install_level
select @computer_name = computer_name from inserted
select @user = create_user from inserted

if @row <=0
begin
set @error = 'Please input software install level'
raiserror(@error,16,1)
return
end
else
begin
if @computer_name is not null or @computer_name <> ''
begin

insert into c_software_dtl (computer_name,software_id,create_user,create_date,update_user,update_date,standard,install_date)
select @computer_name,software_id,@user,getdate(),@user,getdate(),'Y',getdate() from c_software_install_level

insert into c_network_dtl(computer_name,create_user,create_date,update_user,update_date)
select inserted.computer_name,inserted.create_user,inserted.create_date,inserted.update_user,inserted.update_date from inserted
end
end
set nocount off
我把insert 和delete 這倆個觸發器隱掉﹐update窗口里dw的表時不觸發update這個觸發器,我在update觸發器里也有raiserror('rew',16,1)調試了就是不觸發update這個觸發器﹐
我釋放insert和delete 觸發器﹐當update窗口里dw的表時觸發的是insert和delete觸發﹐后來我把dw里的表刪除﹐重建該表﹐為該表重建觸發器還是不行。
急呀﹐各位仁哥和美M幫幫忙煩看一下﹐謝謝






...全文
327 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzheng2001 2005-10-24
  • 打赏
  • 举报
回复
我写了这么多程序现在才注意到这个问题, 只因为从来只用update选项,而不用 delete and insert 的. 个人认为delete and insert 的做法不好, 你只修改了数据,但却触发了insert and delete 触发器,很容易会产生不必要的误会,而导致错误! 而且性能上也有一点的影响

  • 打赏
  • 举报
回复
当数据窗口选择了delete and insert时,并不是所有的UPDTE都是先删除后插入,只有更新的列涉及到主健时,才后先删除后插入. 如果只是更新其中普通的列,系统还是会进行update操作的, 其实要证实这个很简单,你在sqlpreview事件中加上一句 messagebox('sqlpreview',sqlsyntax)就可以观察得出来.
lzheng2001 2005-10-21
  • 打赏
  • 举报
回复
那么你用messagebox("test sql",sqlsyntax) 看到的SQL语句,是什么? 你测试了没有? 如果生成的是delete and insert 语句,不会触发update触发器的! 请检查数据窗口以外的地方吧.

为了证明是否你的数据窗口设置有问题,可以这个语句测试一下,放在SQLPreview事件中

if dw_1.describe("datawindow.table.UpdateKeyInPlace") = "Yes" then
messagebox("test","use the UPDATE")
else
messagebox("test","use a DELETE and an INSERT")
end if
messagebox("test sql",sqLsyntax)

请认真测试了以后再把问题说出来.
lzheng2001 2005-10-21
  • 打赏
  • 举报
回复
那么你用messagebox("test sql",sqlsyntax) 看到的SQL语句,是什么? 你测试了没有? 如果生成的是delete and insert 语句,不会触发update触发器的! 请检查数据窗口以外的地方吧.

为了证明是否你的数据窗口设置有问题,可以这个语句测试一下,放在SQLPreview事件中

if dw_1.describe("datawindow.table.UpdateKeyInPlace") = "Yes" then
messagebox("test","use the UPDATE")
else
messagebox("test","use a DELETE and an INSERT")
end if
messagebox("test sql",sqLsyntax)

请认真测试了以后再把问题说出来.
cbz0660 2005-10-21
  • 打赏
  • 举报
回复
樓上的﹐我剛才按你的方法試了﹐我在update第一個表時﹐我的update proprertes的屬性是delete and insert ﹐update的時候首先觸發的是delete觸發器﹐后來把update proprertes的屬性改成 use update以后就觸發了update觸發器﹐我想是因為我update的主鍵的原因吧﹐因為我用同樣的方法update另一個表﹐update proprertes的屬性是delete and insert﹐在update的時候就會觸發update觸發器。也查了書我想是并發執行的原因吧﹐當update表的主鍵時delete and insert 的屬性就不觸發updaet的觸發器。
不過我還是不是很明白﹐同時也謝謝各位那么關心這問題﹐要是能給我詳細的解答就好了﹐謝謝各位﹐分我是一定給的
cbz0660 2005-10-21
  • 打赏
  • 举报
回复
謝謝你﹐我試試
WorldMobile 2005-10-21
  • 打赏
  • 举报
回复
应该是跟主键有关系,你可以用把update属性改为delete and insert

不过你的触发器要对这些情况进行处理

cbz0660 2005-10-21
  • 打赏
  • 举报
回复
TO:LZheng2001(1加1)
我用你的這段代碼測試了
if dw_1.describe("datawindow.table.UpdateKeyInPlace") = "Yes" then
messagebox("test","use the UPDATE")
else
messagebox("test","use a DELETE and an INSERT")
end if
messagebox("test sql",sqLsyntax)
無論我的update屬性改成delete and insert 還是use update 可在保存的時候messagebox里都是use a DELETE and an INSERT﹐ sql請句當我update第一個表時是觸發的delete語句﹐然后是insert語句﹐后來我把update的屬性改成use update后就觸發的是update語句﹐我第一個表update的是表的主鍵.我也用你的語句update第二個表sql觸發的是update請句﹐第二個表update的不是主鍵﹐我想這跟主鍵有關吧
cbz0660 2005-10-21
  • 打赏
  • 举报
回复
TO:LZheng2001(1加1)
我已經按照你說的測試了﹐結果是在update的時候首先觸發的是delete and insert事件﹐我把表的update propertes的屬性改天 use update就觸發了update事件﹐我想是不是我update是表的主鍵﹐因為我的另一個表的update proprertes的屬性是delete and insert﹐可在update的時候就能觸發update觸發器﹐我想可能是因為我update的不是主鍵吧。
lzheng2001 2005-10-19
  • 打赏
  • 举报
回复
原理已经说得很明白了,可以自己再想想办法嘛.

为了证明是否由于DW触发了UPDATE触发器,你可以在DW的sqlpreview事件中写上,
messagebox("test sql",sqysyntax)
来看看DW生成的SQL语句,一切就会很明白了
cbz0660 2005-10-19
  • 打赏
  • 举报
回复
怎么沒人解答
cbz0660 2005-10-17
  • 打赏
  • 举报
回复
楼上的,我没有修改update properties的的设置,请各位高手帮我解答,谢谢
lzheng2001 2005-10-14
  • 打赏
  • 举报
回复
就是一楼说的问题呀! 你到dw的update properties看一下就知道了!
cbz0660 2005-10-14
  • 打赏
  • 举报
回复
Li_d_s我先看看我的dw吧﹐謝謝﹐歡迎光臨
cbz0660 2005-10-14
  • 打赏
  • 举报
回复
怎么沒人理我呀﹐自己頂了
li_d_s 2005-10-14
  • 打赏
  • 举报
回复
你的dw的update properties属性里面设置的更新方式是delete and insert,那样pb会先删除数据后insert数据,当然会触发delete触发器,你选成use update就可以了
lzheng2001 2005-10-14
  • 打赏
  • 举报
回复
delete and insert不会触发update触发器的,可能是你搞错了!
也有可能是你的代码中修改了update properties的设置
cbz0660 2005-10-14
  • 打赏
  • 举报
回复
我想是不是跟update主鍵有關﹐要是update的是主鍵的話就得改DW的update properties嗎?我另外一個dw update不是主鍵就可以觸發update的觸發器
cbz0660 2005-10-14
  • 打赏
  • 举报
回复
我更改dw的update properties了﹐把delete and insert屬性改成了use update﹐問題解決了﹐不過我有一個疑問是我的另外一個dw的update屬性是 delete and insert我在update的時候他會觸發update的觸發器﹐我不知道是為什么

1,079

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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