大力:请帮解决这个问题:instead of update 触发器不能执行以下语句

hncxxs 2003-11-11 04:31:33
CREATE TRIGGER trg_upd ON [dbo].[kaoqi]
instead of update
AS
declare @sql varchar(1000)
set @sql= ' update Employee set name=''xs400 '''
exec( @sql)


我想使用这段触发器来代替sql的update ,可是不能更新数据,如果用
update Employee set name='xs400 '就可更新数据,不知insetead 触发器
是否支持exec(@sql)这种动态sql
...全文
138 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
远程Scada 2003-11-18
  • 打赏
  • 举报
回复
pb 向sqlserver 发送一条update kaoqi set name='xs400 '

CREATE TRIGGER trg_upd ON [dbo].[kaoqi]
instead of update
AS
declare @sql varchar(1000)
set @sql= ' update kaoqi set name=''xs4001 '''
exec( @sql)

---->>>>>>>
first:update kaoqi set name='xs4001 '
second:update kaoqi set name='xs400 '
so....
hncxxs 2003-11-13
  • 打赏
  • 举报
回复
TO 大力:
我是想达到这样的效果:
客户端(PB,DELPHI)向SQL提交更新kaoqi的语句(比如update kaoqi set name='xs400 ')
但是在SQL我想拦截更新语句,不要执行这条更新语句,想要我自己的处理逻辑,所以
我在kaoqi加了instead of update触发器,但是碰到这样一个问题:
我的处理逻辑需要使用动态sql来更新kaoqi自己,但是sql server执行动态sql后没有更新
kaoqi表数据。

例如:pb 向sqlserver 发送一条update kaoqi set name='xs400 '
我在sql server 建立这样一个触发器

CREATE TRIGGER trg_upd ON [dbo].[kaoqi]
instead of update
AS
declare @sql varchar(1000)
set @sql= ' update kaoqi set name=''xs4001 '''
exec( @sql)

但是sql server 执行后并没有将kaoqing 的name更新成xs4001,如果在触发器里不用动态sql就可以更新,比如直接写update kaoqi set name='xs4001 '就可以。


pengdali 2003-11-13
  • 打赏
  • 举报
回复
不懂你说什么,描述清楚些吧。
hncxxs 2003-11-12
  • 打赏
  • 举报
回复
唉.....自己頂一下
hncxxs 2003-11-12
  • 打赏
  • 举报
回复
高高手都那裡去了?
hncxxs 2003-11-11
  • 打赏
  • 举报
回复
TO 大力:
剛才寫錯了

CREATE TRIGGER trg_upd ON [dbo].[kaoqi]
instead of update
AS
declare @sql varchar(1000)
set @sql= ' update kaoqi set name=''xs400 '''
exec( @sql)



我現在是想更新kaoqi表,在instead更新其他表是沒有問題的,
我是想update獲,在instead中有選擇的更新本身表(kaoqi)字段,
請再指教.
pengdali 2003-11-11
  • 打赏
  • 举报
回复
create table kaoqi(name varchar(10))
create table Employee(name varchar(10))
go
CREATE TRIGGER trg_upd ON [dbo].[kaoqi]
instead of update
AS
declare @sql varchar(1000)
set @sql= ' update Employee set name=''xs400 '''
exec( @sql)
go
insert Employee values('a')
go
update kaoqi set name='s'
go
select * from Employee

/*
name
----------
xs400

(所影响的行数为 1 行)
*/
实验5.1 存储过程的建立与使用 一、实验目的 理解存储过程的概念、作用、建立和调用方法。 二、实验原理 使用CREATE PROCEDURE语句创建存储过程,ALTER PROCEDURE语句修改存储过程,DROP PROCEDURE语句删除存储过程,存储过程有不带参数的、有带输入参数的、有带输出参数(output)的,还可以有带返回值的。创建好的存储过程可以使用EXEC procedure_name语句执行。 实验5.2 触发器的建立与使用 一、实验目的 理解触发器的概念和作用;了解触发器的分类及触发条件;掌握触发器的定义及应用。 二、实验原理 1、 使用CREATE TRIGGER语句定义触发器,ALTER TRIGGER语句修改触发器,DROP TRIGGER语句删除触发器。 2、 触发器分AFTER/FOR和INSTEAD OF两种类型:AFTER/FOR类型的触发器是在相应的触发语句(insert、delete、update执行完后被触发的。如果触发语句对应的表上有完整性约束,这些完整性约束必须不违背时,相应的触发语句才能执行,然后才能触发对应的AFTER/FOR类型的触发器。INSTEAD OF类型的触发器会在触发语句(insert、delete、update执行之前被触发,并取代相应的触发语句。 3、 在表或视图上,每个INSERT、UPDATE或DELETE语句只能创建一个INSTEAD OF类型的触发器,无法为有外键约束且指定为级联删除或级联修改的表创建DELETE或UPDATE语句上的INSTEAD OF 类型的触发器。 SQL SERVER为每个触发器都创建了两个临时表INSERTED表和DELETED表,这两个表的逻辑结构与被触发器作用的表一样,用户可以读取这两个表的内容,但不能对它们进行修改,触发器执行完后,这两个表也会自动删除。当执行INSERT时,INSERTED表中保存要向表中插入的所有行;当执行DELETE时,DELETED表中保存要从表中删除的所有行;当执行UPDATE时,修改前的行保存在DELETED表中,修改后的行保存在INSERTED行中。

34,499

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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