原帖地址:
http://community.csdn.net/Expert/topic/3298/3298074.xml?temp=.6988336
table1为初始化数据,table2为已用票据
在table2上写触发器,table2每insert,update,or 批量delete时,实时体现tabel1的'已用票号','已用票数', '结余票号','结余票数'的值.
-----------------------------------------------------------------------------------------------------------------------
--示例
--示例数据
create table table1(序号 int,类别 varchar(10),起始号 char(7),终止号 char(7),总数 int,已用票号 varchar(8000),已用票数 int,结余票数 int,结余票号 varchar(8000),组合编号 varchar(20))
insert table1 select 1,'A','0000001','0000010',10,NULL,0,10,'0000001-0000010','A-0000001-0000010'
union all select 2,'B','0000011','0000020',10,NULL,0,10,'0000011-0000020','B-0000011-0000020'
create table table2(组合编号 varchar(20),类别 varchar(10),票号 char(7))
go
--触发器
create trigger tr_process on table2
for insert,update,delete
as
select id=identity(int,1,1)
,a.组合编号,a.票号
,b.起始号,b.终止号
,已用票号=cast(null as [varchar] (8000))
,结余票号=cast(null as [varchar] (8000))
into #t
from table2 a,table1 b
where a.组合编号=b.组合编号
and (exists(select 1 from inserted where 组合编号=a.组合编号)
or exists(select 1 from deleted where 组合编号=a.组合编号))
order by a.组合编号,a.票号
declare @组合编号 varchar(20),@票号 int
,@已用票号 varchar(8000),@结余票号 varchar(8000)
update #t set
@已用票号=case
when 组合编号=@组合编号
then case
when 票号=@票号+1
then case
when right(@已用票号,1)='-'
then @已用票号+票号
else left(@已用票号,len(@已用票号)-7)+票号
end
else case
when right(@已用票号,1)='-'
then left(@已用票号,len(@已用票号)-1)
else @已用票号 end+','+票号+'-'
end
else 票号+'-'
end,
@结余票号=case
when 组合编号=@组合编号
then case
when 票号=@票号+1
then left(@结余票号,len(@结余票号)-8)
when right(9999999+票号,7)+'-'=right(@结余票号,8)
then left(@结余票号,len(@结余票号)-1)+','
else @结余票号+right(9999999+票号,7)+','
end+right(10000001+票号,7)+'-'
else case
when 起始号=票号
then ''
when cast(起始号 as int)+1=票号
then 起始号+','
else 起始号+'-'+right(9999999+票号,7)+','
end+right(10000001+票号,7)+'-'
end,
已用票号=@已用票号,
结余票号=@结余票号,
@票号=票号,
@组合编号=组合编号
update a set
已用票号=case
when right(b.已用票号,1)='-'
then left(b.已用票号,len(b.已用票号)-1)
else b.已用票号
end,
结余票号=case
when b.终止号=b.票号+1
then left(b.结余票号,len(b.结余票号)-1)
when len(b.结余票号)=8 and b.终止号<stuff(b.结余票号,1,1,'')
then ''
when b.终止号<left(right(b.结余票号,8),7)
then left(b.结余票号,len(b.结余票号)-9)
else b.结余票号+b.终止号
end,
已用票数=c.已用票数,
结余票数=a.总数-c.已用票数
from table1 a,#t b,(
select id=max(id),已用票数=count(*)
from #t
group by 组合编号
)c where a.组合编号=b.组合编号
and b.id=c.id
--处理在子表中被全部删除的数据
if exists(select 1 from deleted a where not exists(select 1 from table2 where 组合编号=a.组合编号))
update a set 已用票号='',已用票数=0,结余票数=a.总数,结余票号=a.起始号+'-'+a.终止号
from table1 a,(
select distinct 组合编号 from deleted a
where not exists(select 1 from table2 where 组合编号=a.组合编号)
)b where a.组合编号=b.组合编号
go
--插入第1条记录
insert table2 select 'A-0000001-0000010','A','0000001'
--显示结果
select 序号,已用票号,已用票数,结余票数,结余票号,组合编号 from table1
go
--插入第2条记录
insert table2 select 'A-0000001-0000010','A','0000002'
--显示结果
select 序号,已用票号,已用票数,结余票数,结余票号,组合编号 from table1
go
--插入第3条记录
insert table2 select 'A-0000001-0000010','A','0000004'
--显示结果
select 序号,已用票号,已用票数,结余票数,结余票号,组合编号 from table1
go
--插入第4条记录
insert table2 select 'A-0000001-0000010','A','0000003'
--显示结果
select 序号,已用票号,已用票数,结余票数,结余票号,组合编号 from table1
go
--修改记录
update table2 set 组合编号='B-0000011-0000020',票号='0000011'
where 组合编号='A-0000001-0000010' and 票号='0000002'
--显示结果
select 序号,已用票号,已用票数,结余票数,结余票号,组合编号 from table1
go
--批量删除:
delete from table2
where 票号 in ('0000001','0000002','0000011')
--显示结果
select 序号,已用票号,已用票数,结余票数,结余票号,组合编号 from table1
go
--删除测试
drop table table1,table2
/*--结果自己看--*/
分享到:
相关推荐
当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:UPDATE、INSERT 或DELETE。触发器可以查询其它表,而且可以包含复杂的 SQL 语句。它们主要用于强制复杂的业务规则或要求。 触发器的...
触发器使用教程和命名规范 Oracle 触发器是一种数据库对象,它与某张表相关联,当有 DML 语句对表进行操作时,可以引起触发器的执行...但是,触发器也可以增加数据库的复杂性和难以维护性,因此需要合理地使用触发器。
Oracle数据库触发器是数据库管理系统中的一种重要特性,它允许开发者在特定的数据操作(如INSERT、UPDATE、DELETE)之前或之后执行自定义的...在实际项目中,应综合考虑业务需求、性能和可维护性来决定是否使用触发器。
触发器主要用于维护数据的一致性和完整性,或者执行一些额外的操作,比如日志记录、审计跟踪等。在本例中,我们需要创建一个触发器来根据“是否会员”这一字段的值自动设置“金额”字段。 首先,我们需要了解触发器...
例如,可以添加UNIQUE约束来防止销售表中的主键重复,以及FOREIGN KEY约束来维护引用完整性,确保产品编号和客户编号对应的产品表和客户表中的记录存在。 最后,实验中创建了一个替代类型触发器,即"viewson",它是...
在修改后的触发器中,使用raiserror配合自定义消息编号50005来记录操作信息。 6. 层次架构设计(Three-Tier Architecture): 文中提到,由于安全性考虑,不建议在客户端/服务器(C/S)架构中直接写入文件系统,...
在`update_empno.sql`这个文件中,可能包含了对员工编号(empno)进行更新的触发器定义。 触发器分为两种类型:DML触发器和DDL触发器。DML触发器响应INSERT、UPDATE或DELETE操作,而DDL触发器则响应数据库架构改变...
使用触发器和存储过程可以带来以下几个优点: * 提高数据的一致性和完整性 * 减少数据的冗余和错误 * 提高系统的安全性和可维护性 * 提高系统的执行效率和性能 触发器和存储过程是数据库管理系统中两个非常重要的...
图书管理系统触发器 在图书管理系统中,触发器是一种特殊的存储过程,用于强制业务规则和数据完整性。触发器基于表建立,可以视作表的一部分。...* 触发器应该经常维护和更新,确保其正确性和一致性。
5. 最后,我们使用系统存储过程查看了创建的所有触发器,以便确认它们的存在和状态。 **实验总结** 通过这次实验,我们不仅理解了存储过程和触发器的基本概念,还掌握了如何创建和应用它们。实验虽然简单,但能让...
1. **理解触发器的基本概念**:了解触发器如何工作以及它们在维护数据一致性方面的作用。 2. **创建触发器**:学习如何使用SQL语句创建不同类型的触发器。 3. **管理触发器**:掌握触发器的查看、修改和删除方法。 4...
在创建新的触发器之前,经常需要检查是否已经存在同名的触发器。若存在,则先删除该触发器。例如,在文件内容中,如果触发器infoNum已存在,则会先删除它,然后再创建新的触发器。 5. 触发器内的逻辑实现: 触发器...
要使用这个触发器,首先需要初始化`@sum`变量为0,然后执行插入操作,最后查询`@sum`的值。 ```sql SET @sum = 0; INSERT INTO account VALUES(137,14.98), (141,1937.50), (97,-100.00); SELECT @sum AS 'Total ...
3. 更新部门编号时,触发器会同步更新所有相关员工的部门编号,确保数据关联正确。 4. 创建一个触发器来防止特定员工(如ID为01的员工)被删除,保护关键数据不受意外删除的影响。 测试这些触发器可以通过尝试执行...
触发器是数据库系统中一种非常重要的对象,它们...然而,触发器应当谨慎使用,因为过度使用或不恰当的设计可能会导致性能下降和维护复杂性增加。在设计数据库系统时,应充分考虑触发器的适用场景,并尽可能优化其实现。
SQL Server 是由微软开发的一种关系型数据库管理系统,触发器是它中一种功能强大的数据库对象,主要用于在数据库表...正确地使用触发器,可以极大地方便数据库的维护和扩展,而不当的使用则可能引发数据库性能问题。
触发器可以用来维护数据的完整性和一致性,实现数据的自动化处理和验证。 触发器可以被用来实现数据的验证、数据的审核、数据的备份和恢复等等。在数据库设计中,触发器可以用来确保数据的正确性和一致性。 4. ...
通过使用存储过程和触发器,我们可以实现一些复杂的数据库操作,并且可以自动执行某些操作,从而提高工作效率。 总结 这个实验报告展示了存储过程和触发器的基本概念和应用。通过这两个实验,我们可以看到,存储...