• 主页
  • 基础类
  • 应用实例
  • 新技术前沿

请问这种触发器该怎么写呀?

qg1977 2004-12-23 06:29:31
表aa,字段为:月份
如果我希望一个表bb每增加一条记录时,该表bb的字段 月份就能够自动赋值为表aa的字段"月份"的最大值,请问该如何写该触发器呀!
谢谢!
...全文
184 点赞 收藏 9
写回复
9 条回复
yinleiyoung 2004年12月28日
你可以从inserted中取字段,但这里id是主键,系统可以自动生成的,插入时完全不用写该字段的值,所以也取不到的。我们一般用的触发器都是after类型的,这个网站学习sql挺好的:http://www.ddvip.net/database/mssql/index.asp
回复 点赞
yinleiyoung 2004年12月28日
其实这个触发器的过程是这样的:当记录插入以后才会启动触发器。
注意其中的语句:
select @month=(select top 1 aa_month from aa order by aa_month desc),它表示从aa表中取月份的最大值。
@id=(select max(id) from bb)它表示从bb表中取最大的id值,注意这时记录已经被插入了,最大的id值就是刚插入的记录的id值。我试过的!
回复 点赞
kinglccs 2004年12月28日
每个触发器有两个特殊的表插入表和删除表这两个表是逻辑表并且这两个表是
由系统管理的存储在内存中不是存储在数据库中因此不允许用户直接对其修改这
两个表的结构总是与被该触发器作用的表有相同的表结构这两个表是动态驻留在内存中
的当触发器工作完成这两个表也被删除这两个表主要保存因用户操作而被影响到的
原数据值或新数据值另外这两个表是只读的即用户不能向这两个表写入内容但可
以引用表中的数据例如可用如下语句查看DELETED 表中的信息
select * from deleted
对一个定义了插入类型触发器的表来讲一旦对该表执行了插入操作那么对向该表
插入的所有行来说都有一个相应的副本存放到插入表中即插入表就是用来存储向原表
插入的内容

对一个定义了删除类型触发器的表来讲一旦对该表执行了删除操作则将所有的删
除行存放至删除表中这样做的目的是一旦触发器遇到了强迫它中止的语句被执行时
删除的那些行可以从删除表中得以恢复
需要强调的是更新操作包括两个部分即先将更新的内容去掉然后将新值插入
因此对一个定义了更新类型触发器的表来讲当报告会更新操作时在删除表中存放了旧
值然后在插入表中存放新值
由于触发器仅当被定义的操作被执行时才被激活即仅当在执行插入删除和更新
操作时触发器将执行每条SQL 语句仅能激活触发器一次可能存在一条语句影响多
条记录的情况在这种情况下就需要变量@@rowcount 的值该变量存储了一条SQL 语
句执行后所影响的记录数可以使用该值对触发器的SQL 语句执行后所影响的记录求合
计值一般来说首先要用IF 语句测试@@rowcount 的值以确定后面的语句是否执行


回复 点赞
SARSII 2004年12月27日
sql server修改记录时,新数据复制到临时表inserted中,旧数据移到临时表deleted中。
比如
id data
1 100
...........

如果修改为

id data
2 200
.............
那么1,100在deleted中获取,2,200在inserted中获取,够详细的了吧。
回复 点赞
qg1977 2004年12月27日
可我并没在孤虹兄的代码中发现从临时表inserted中获取主键id的值,而是直接取触发器一开始所定义的变量id,请问这是为什么?
还有如果是修改记录时呢,又如何得所修改记录的主健值呢?
请各位大侠多多指教!
回复 点赞
SARSII 2004年12月26日
sql server插入新记录时,可从临时表inserted中获取。
回复 点赞
qg1977 2004年12月26日
我主要是不太明白当插入一条记录时,sql server如何获取这条新插入的记录,然后再对这条记录的某字段进行修改。
孤虹兄的意思是不是当表设有主键时,每当插入记录时变量id都会等于新插入记录的主键id?
如果是修改一条记录时呢?如果表没有设主键呢?
回复 点赞
yinleiyoung 2004年12月23日
我假设:你的表aa,bb中都有字段id作为主键,aa中的月份字段为aa_month,
bb中的月份字段为bb_month,触发器名字为yyy,思路为:插入记录后将这条记录的月份字段更 新:
CREATE TRIGGER yyy ON dbo.bb
FOR INSERT
AS
declare @id int,
@month nvarchar(20)
select @month=
(select top 1 aa_month from aa order by aa_month desc),
@id=
(select max(id) from bb)

update bb set bb_month=@month where id=@id
回复 点赞
zbo 2004年12月23日
是题目就这么要求的吗?
比如在记录去年12月买了白菜。
则今年1月份买白菜时,自动记录为12月?
回复 点赞
发动态
发帖子
MS-SQL Server
创建于2007-09-28

1.4w+

社区成员

25.3w+

社区内容

MS-SQL Server相关内容讨论专区
社区公告
暂无公告