dw的update语句set部分为何总用所有字段?
我的dw连着一个带update型trigger的表,这个trigger只在有且只有c1字段被更新时作相应处理,可我发现dw不管是否只有c1字段被更新,产生的set部分总是包括了所有字段
即set c1=,c2=,c3= ...,这该如何是好?
问题点数:40、回复次数:17Top
1 楼powerbu(变)回复于 2001-09-22 20:59:21 得分 0
没有啊,如过那些列不能为空才必须要SET
如果你不想修改某些列(允许为空),可以SET CXXX=NULLTop
2 楼NetColorWolf(NCW)回复于 2001-09-22 21:08:42 得分 0
那是因为你在DW painter中选择属性Update Properties中,将所有可以更新的列都选中了。w你可以在其中只选择你要更新的列。Top
3 楼killerdanny(堕落的瓦拉斯塔兹)回复于 2001-09-22 21:11:17 得分 0
自己多操作几次就明白了.
有的时候,掌握一门工具有一个很好的方法.就是一个名人的名字呀-------------->胡适!Top
4 楼rabbitsfoot(大哥)回复于 2001-09-22 23:36:59 得分 0
NetColorWolf(NCW)说的对Top
5 楼popolop(pb老流氓)回复于 2001-09-22 23:59:20 得分 0
killerdanny(danny) 说的好 咱也是这样过来的,感觉和打魂斗罗,马丽一样,
多练几次,翻烂点书就挺过来了Top
6 楼probeman()回复于 2001-09-23 14:59:14 得分 0
首先谢了,我想我没把问题说清楚。
我的dw所有字段都必须是能更新的,只是想在用户只修改了c1字段而未修改其他字段时才执行trigger里的特定操作.我知道dw生成的update语句里where部分的生成方式可设置,但
set部分没法控制,某字段如c2的修改状态为NotModified!时,set部分还是包括了c2=...,非常讨厌,这样就不能在trigger里判明是否只有c1字段被更新了,因为dw提交给数据库的sql语句的set部分包含了所有字段(尽管用户在dw里只修改了c1字段,但其他字段如c2还是用原值在set部分重设了一遍).
现在请大家再帮我想一下吧!Top
7 楼susu_0807(苏苏)回复于 2001-09-23 15:49:09 得分 0
把key modification 改为use update.Top
8 楼Sunny21cn(毛头)回复于 2001-09-23 15:52:03 得分 0
你错了,这个问题应该可以在Trigger里解决的。Top
9 楼Sunny21cn(毛头)回复于 2001-09-23 15:59:34 得分 0
比如:下面是一个asa的triggger
CREATE TRIGGER
tr_manager BEFORE UPDATE OF dept_head_id ON department
REFERENCING OLD AS old_dept
NEW AS new_dept
FOR EACH ROW
BEGIN
DELCARE @new_id char(10), @old_id char(10)
select @new_id = new_dept.dept_head_id
select @old_id = old_dept.dept_head_id
IF @new_id <> @old_id
UPDATE employee
SET employee.manager_id=new_dept.dept_head_id
WHERE employee.dept_id=old_dept.dept_id
ENDTop
10 楼probeman()回复于 2001-09-23 16:00:48 得分 0
to Sunny21cn(无名)
怎么解决Top
11 楼Sunny21cn(毛头)回复于 2001-09-23 16:16:39 得分 0
你这个问题应该在Trigger里解决
你觉得上面的代码对你没有帮助吗?Top
12 楼Sunny21cn(毛头)回复于 2001-09-23 16:21:03 得分 0
上面的例子里,假设dept_head_id是你想监控的字段
new_dept保存已更新的一行的数据
old_dept保存是更新以前的一行中的数据
所以比较new_dept.dept_head_id和old_dept.dept_head_id是否不同,就可以判断该字段是否被修改.
Top
13 楼probeman()回复于 2001-09-23 16:22:48 得分 0
to Sunny21cn(无名)
你的trigger是对的,可我不知在ms sql server 中如何写.Top
14 楼Sunny21cn(毛头)回复于 2001-09-23 16:41:45 得分 0
这要看你的字段在表里的具体位置,比如是5
在trigger中这样判断
IF COLUMNS_UPDATED( POWER( 2, 5 - 1 ) ) > 0
BEGIN
--被修改了。
ENDTop
15 楼probeman()回复于 2001-09-23 19:57:55 得分 0
多谢,但update(columnname)和COLUMNS_UPDATED()函数都只是指出update tablename set
语句里明确指出了那些列,至于是否与原值相等的判断依靠deleted和inserted系统表不是很好处理,我不知道deleted和inserted系统表中每一行是否是一一对应的.Top
16 楼Sunny21cn(毛头)回复于 2001-09-25 18:54:43 得分 40
针对Update,PB的数据窗口有两种模式,一种是update,另一种是delete & insert。你可以试试第二种模式。
我很少用MS Sql Server,所以不能给你一个满意的答复。通过你的问题,我对MS Sql Server的Trigger也了解了一些,所以也谢谢你。
希望多联系。Top
17 楼probeman()回复于 2001-09-28 11:39:03 得分 0
看来只能先这样了。Top




