求高效触发器

Methodor 2006-10-28 07:06:50
简单描述:使用update触发器修改某列
问题:在下表中增加update触发器,当a011、a021、a031或a041发生变化后,自动将该列变化前后的差值放到a012、a022、a032、a042列中,同时计算a011、a021、a031和a041这4列的最大值(同一行),放到a091列,如果是a011列的值最大,则将a092列设为1,如果是a021列的值最大,则将a092列设为2,如果是a031列的值最大,则将a092列设为3,如果是a041列的值最大,则将a092列设为4。


简单示意表结构:
CREATE TABLE dbo.tb04 (
aa01 int NOT NULL,
a011 decimal(6,3) NOT NULL,
a012 decimal(6,3) NOT NULL,
a021 decimal(6,3) NOT NULL,
a022 decimal(6,3) NOT NULL,
a031 decimal(6,3) NOT NULL,
a032 decimal(6,3) NOT NULL,
a041 decimal(6,3) NOT NULL,
a042 decimal(6,3) NOT NULL,
a991 decimal(6,3) NOT NULL,
a993 smallint NOT NULL ,
CONSTRAINT pk_tb04 PRIMARY KEY NONCLUSTERED (aa01)) ;
CREATE UNIQUE INDEX idx_01 ON dbo.tb04 (...) ;
CREATE UNIQUE INDEX idx_02 ON dbo.tb04 (...) ;
...

实际表结构比较庞大,访问和变化频率也比较高,因此要求触发器的效率非常好
...全文
252 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Methodor 2006-10-29
  • 打赏
  • 举报
回复
ok
Methodor 2006-10-29
  • 打赏
  • 举报
回复
收到
谢谢

准备将getmax函数的char参数换为decimal或int修改一下试试效率如何
HappyQQ 2006-10-28
  • 打赏
  • 举报
回复
高人就是不一样呀!!
Well 2006-10-28
  • 打赏
  • 举报
回复
简单描述:使用update触发器修改某列
问题:在下表中增加update触发器,当a011、a021、a031或a041发生变化后,自动将该列变化前后的差值放到a012、a022、a032、a042列中,同时计算a011、a021、a031和a041这4列的最大值(同一行),放到a091列,如果是a011列的值最大,则将a092列设为1,如果是a021列的值最大,则将a092列设为2,如果是a031列的值最大,则将a092列设为3,如果是a041列的值最大,则将a092列设为4。

/*自定义函数*/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[GetMax]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[GetMax]
GO

/*
函數說明:取字符串裡將分割數據(int)的最大值
創建人:xw_cai
創建日期:2005-10-06
-------------------------------------------------------------------------------
例如:
select dbo.GetMax('80;60;70;100',';')
100
*/
CREATE function GetMax(@vString varchar(100),@cDivisionChar varchar(10))
returns int
as
begin
declare @iCount int
,@iPos int
,@vGetString int
,@iMax int --@vString varchar(100),
if(right(rtrim(@vString),1)<>@cDivisionChar)
begin
set @vString=@vString+@cDivisionChar
end
select @iCount=len(@vString)-len(replace(@vString,@cDivisionChar,''))
,@iPos=1,@vGetString=''
,@iMax=0
while(@iCount>=@iPos)
begin
set @vGetString = cast(left(@vString,charindex(@cDivisionChar,@vString)-1) as int)
if(@iMax<@vGetString)
begin
set @iMax=@vGetString
end
set @vString=right(@vString,len(@vString)-charindex(@cDivisionChar,@vString))
set @iPos=@iPos+1
end
return @iMax
end
GO


---------------------
CREATE TRIGGER [UpdateTbData] ON [dbo].[tb04]
FOR UPDATE
AS

if(update(a011) or update(a021) or update(a031) or update(a041))
begin
update a
set a012=a.a011
,a022=a.a021
,a032=a.a031
,a042=a.a041
,a091=dbo.GetMax(cast(a.a011 as varchar)+';'+cast(a.a021 as varchar)+';'+cast(a.a031 as varchar)+';'+cast(a.a041 as varchar),';')--取得最大值
,a092=case GetMax(cast(a.a011 as varchar)+';'+cast(a.a021 as varchar)+';'+cast(a.a031 as varchar)+';'+cast(a.a041 as varchar),';')
when a.a011 then 1
when a.a021 then 2
when a.a031 then 3
when a.a041 then 4 end
from tb04 a inner join Inserted b
on a.aa01=b.aa01--关键字唯一性(这里要是关键联合查询,要是唯一确定性)

end
xiaoku 2006-10-28
  • 打赏
  • 举报
回复
呵呵
你的逻辑决定了你的触发器就是这样的了!
不过也不是太慢的阿!

表结构太复杂的话,会影响性能,最好分开几个表!
作为企业级大型、通用对象关系型数据库管理系统,神通数据库为用户提供的功能包括: • 支持丰富的数据类型 神通数据库所支持的数据类型包括:字符串类型、位串类型、精确数值类型、布尔型、近似数值类型、 日期类型、时间间隔类型、货币类型、二进制大对象、字符型大对象等。 • 提供功能强大的内置函数 神通数据库系统提供了丰富的内置函数,并可以根据用户的实际需要,定制特殊的函数。系统提供的内 置函数主要包括:数学函数、字符串函数、日期时间函数、类型转换函数聚集函数等。 • 支持视图 神通数据库对数据视图提供了完善的支持,从而允许不同的用户或应用程序以不同的方式查看同一数 据。该项功能不仅使数据更易于访问,而且可以利用它限制某些用户能够查看或更新的行和列。视图可以有 效地减少数据库中的数据冗余,并为实现灵活的数据安全机制提供了基础。 • 支持存储过程 使用数据库创建应用程序时,过程语言是应用程序和数据库之间的主要编程接口。神通数据库中所提 供的过程语言是 plOSCAR。在使用 plOSCAR 程序时,可用两种方法存储和执行程序。可以在本地存储程 序,并创建向数据库发送命令并处理结果的应用程序;也可以将程序在数据库中存储为存储过程,并创建执 行存储过程并处理结果的应用程序。 • 完整性约束机制 神通数据库使用约束来自动强制数据库完整性的方式。约束定义关于列中允许值的规则,是强制完整性 的标准机制。在神通数据库中,支持五类约束: NOT NULL 指定不接受 NULL 值的列。 CHECK 约束对可以对放入列中的值进行限制,以强制执行域的完整性。 UNIQUE 约束在列集内强制执行值的唯一性。 PRIMARY KEY 约束标识列或列集,这些列或列集的值唯一标识表中的行。 FOREIGN KEY 约束标识表之间的关系。 • 支持触发器 在神通数据库系统中,触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效 被触发执行。唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。触发器可以查询其它表,并 9 可以包含复杂的 plOSCAR 语句。神通数据库触发器按照所触发动作的间隔尺寸可以分为语句级触发器和行 级触发器触发器由 CREATE TRIGGER 语句定义,FOR EACH 子句定义了触发动作的间隔尺寸,它既 可以是 FOR EACH STATEMENT(语句级触发器),也可以是 FOR EACH ROW(行级触发器)。 • 支持事务处理 神通数据库提供了高效的事务管理机制,保证每个事务的完整性。该机制提供: 锁定机制,使事务相互隔离。 记录机制,保证事务的持久性。即使服务器硬件、操作系统或数据库自身出现故障,也可以在重新启动 时使用事务日志,将所有未完成的事务自动地回滚到系统出现故障的位置。 事务管理特性,强制保持事务的原子性和一致性。事务启动之后,就必须成功完成,否则数据库系统将 撤消该事务启动之后对数据所作的所有修改。 在神通数据库中一个事务可以由一条或多条 sql 语句构成。事务的提交状态可以是自动提交也可以是手 动提交。有关事务的控制命令包括 BEGIN,COMMIT,ROLLBACK。 • 支持模式 一个数据库可以包含一个或多个命名的模式,一个模式内可以包含多个表。不同的模式中的表名可以相 同,而同一模式中的表不能同名。模式如同操作系统级的目录,但是模式不能嵌套。 用户在相应权限控制下可以访问所连接的数据库中的任何模式中的对象。 模式具有以下特点: 多个用户使用同一数据库而不会互相影响。 对数据库中的对象进行逻辑分组,更便于管理。 各个应用分别使用各自的模式,以避免命名冲突。 在模式中创建数据库对象或访问模式中的对象时,可在对象名前指定模式名。 • 支持数据备份和恢复 神通数据库的备份/恢复工具具有图形化的操作界面。用户利用备份工具可以对整个数据库、指定数据 库、或者指定库中的特定表执行备份操作。备份的数据被保存在用户指定的目录中。利用备份文件,用户可 以利用配套的恢复工具执行恢复操作。备份和恢复工具都提供丰富的选项,以满足不同用户的备份和恢复要 。 • 支持数据迁移 神通数据库的数据导入和导出向导是前台管理工具中的一个实用工具,其主要功能是进行神通数据库 与其它各种异构数据源之间数据的析取、转换以及合并。数据导入和导出工具支持的数据源包括:神通数据 库、Oracle、Microsoft SQL Server、IBM DB2、Microsoft Excel 97-2000、文本文件、其他支持 ODBC 的 数据源。在数据的转换过程中,向导能根据源数据和目标数据具体类型,通过内置的转换规则提供数据类型 的默认映射关系、数据类型的精度匹配、空与非空信息提取、主键及相关索引建立等辅助功能,帮助用

34,590

社区成员

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

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