触发器的问题

ukyo88888 2004-08-11 11:21:23
例如我有一个表test

id
name
num

我想在删除某条记录的时候进行一定规则的验证或者计算过后,看是否符合某种条件,再决定是否可以删除,我应该怎么做!!

请给出一些实例
...全文
175 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiangsmile 2004-08-12
  • 打赏
  • 举报
回复
风云的简洁,应该可以了。我这里测试通过了。
yown 2004-08-11
  • 打赏
  • 举报
回复
用替代触发器

CREATE TRIGGER [test_trigger] ON [dbo].[test]
INSTEAD OF DELETE
as
...
ukyo88888 2004-08-11
  • 打赏
  • 举报
回复
好像不行,我刚才试了一下.
jiangsmile 2004-08-11
  • 打赏
  • 举报
回复
CREATE TRIGGER [test_trigger] ON [dbo].[test]
FOR DELETE
AS
begin
set XACT_ABORT on
declare @sn_del varchar(20),@sn_ins varchar(20),@cun as int,@temp varchar(20)


set @sn_del=''
set @sn_ins=''

select @sn_del=id from deleted del where num>40
select @sn_ins=id from inserted ins where num>40





if (@sn_del='' and @sn_ins='' )
begin
set @temp=''
end

else


begin
select @cun=count(*) from test where id=@sn_ins
if @cun>0
begin
delete test where operatorid=@sn_ins

end


end
jiangsmile 2004-08-11
  • 打赏
  • 举报
回复
一样的啊,你把判断条件变为num>40就好了啊.
select @sn_del=id from deleted del where num>40
select @sn_ins=id from inserted ins where num>40
ukyo88888 2004-08-11
  • 打赏
  • 举报
回复
我说的好像不是这个意思
我重新表达一下

id name num
1 ukyo 32
2 xh 43
3 ux 52
我想在删除某条记录的时候进行验证,如果num>40就可以删除,小于就不能删除
jiangsmile 2004-08-11
  • 打赏
  • 举报
回复
给你个事例,将满足name='jz'的记录删除
CREATE TRIGGER [test_trigger] ON [dbo].[test]
FOR DELETE
AS
begin
set XACT_ABORT on
declare @sn_del varchar(20),@sn_ins varchar(20),@cun as int,@temp varchar(20)


set @sn_del=''
set @sn_ins=''

select @sn_del=id from deleted del where name='jz'
select @sn_ins=id from inserted ins where name='jz'





if (@sn_del='' and @sn_ins='' )
begin
set @temp=''
end

else


begin
select @cun=count(*) from test where id=@sn_ins
if @cun>0
begin
delete test where operatorid=@sn_ins

end
else
begin
delete test where operatorid=@sn_del
end

end

end

























GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

janmie 2004-08-11
  • 打赏
  • 举报
回复
学习!
janmie 2004-08-11
  • 打赏
  • 举报
回复
AFTER 触发器在触发操作(INSERT、UPDATE 或 DELETE)后和处理完任何约束后激发。可通过指定 AFTER 或 FOR 关键字来请求 AFTER 触发器。因为 FOR 关键字与 AFTER 的效果相同,所以具有 FOR 关键字的触发器也归类为 AFTER 触发器。


INSTEAD OF 触发器代替触发动作进行激发,并在处理约束之前激发。

有个疑问,既然是要验证是否满足条件才觉得是否删除,那为什么不直接用select?

如果真要用触发器,那不是要建instead of trigger,然后在判断是否要删除,不是多此一举了?

菜鸟说的话要是错了请见谅!




pbsql 2004-08-11
  • 打赏
  • 举报
回复
--删除触发器例子:
create table t(id int,name varchar(10),num int)
insert into t(id,name,num)
select 1, 'ukyo', 32 union all
select 2, 'xh', 43 union all
select 3, 'ux', 52
go

create trigger [tr_delete] on t
for delete
AS
if exists(select * from deleted where num<=40)
begin
rollback transaction
raiserror('num<=40,不允许删除!!!',16,1)
end
ukyo88888 2004-08-11
  • 打赏
  • 举报
回复
还是不行

触发器是不是删除了数据过后再触发的触发器中的事件哦!!

能不能给一个完整的数据库结构和一个触发器的实例哦!!

万分感谢!!
jiangsmile 2004-08-11
  • 打赏
  • 举报
回复
不好意思,不是operatorid ,应该是你自己的号
begin
select @cun=count(*) from test where id=@sn_del
if @cun>0
begin
delete test where id=@sn_del
end

end
jiangsmile 2004-08-11
  • 打赏
  • 举报
回复
楼主,上面的一段改一下。再试试:
begin
select @cun=count(*) from test where id=@sn_del
if @cun>0
begin
delete test where operatorid=@sn_del
end


end
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

34,875

社区成员

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

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