这个触发器怎么写

yanxiangtianji 2011-03-30 05:14:05
我新学数据库编程,用的是MS SQL 2000,做点东西练练手,我的书上关于触发器只是提了一下,网上搜到东西好多都看不明白(水平差,没办法啊),弄不太明白,希望各位大大不吝赐教。

问题是这样的:我做个一个员工表,里面有一个“分公司号”属性表示这个员工工作在那个分公司。在分公司表里面有一个“员工数量”属性表示在这个分公司工作的员工的数量。
假设它们是表employee,它有name(PK)和workin属性,表branch,它有number(PK)和count两个属性。
我希望员工表添加新元素时,自动将它所在的分公司的员工数加1;删除时减1。
我觉得可以用触发器实现,不知道存储过程行不行?

我的问题是不知道要怎么获得当前添加或删除掉的元素的workin属性,我搜到的东西也没有提到这类功能。

希望各位大大能给个简单的例子让我学习一下,如果实在太忙也请给个入门一点网址或是其他资料,让我有个学习方向。
我在这里先谢谢大家了。
...全文
117 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
select workin from inserted
yanxiangtianji 2011-04-02
  • 打赏
  • 举报
回复
请问
SELECT 1,0 UNION ALL
SELECT 2,0
是什么意思
UPDATE branch SET [count]=c.sl FROM (
SELECT workin,sl=COUNT(1) FROM employee a,branch b WHERE a.workin=b.number GROUP BY workin
) c,branch d WHERE c.workin=d.number
中的count(1)是什么意思,我看到楼上也用到了,是书上的count(*)的意思吗
sl是什么意思,看着像是自行定义的变量,但是定义变量好像不是这样的
谢谢
[Quote=引用 7 楼 wing7742 的回复:]

SQL code

CREATE TABLE branch([number] INT,[count] INT)
INSERT branch
SELECT 1,0 UNION ALL
SELECT 2,0

TRUNCATE TABLE branch

CREATE TABLE employee([name] NVARCHAR(10),workin INT)


DROP TRIGGER t_t……
[/Quote]
wing7742 2011-03-30
  • 打赏
  • 举报
回复

CREATE TABLE branch([number] INT,[count] INT)
INSERT branch
SELECT 1,0 UNION ALL
SELECT 2,0

TRUNCATE TABLE branch

CREATE TABLE employee([name] NVARCHAR(10),workin INT)


DROP TRIGGER t_tmp

CREATE TRIGGER t_tmp ON employee AFTER INSERT,DELETE
AS
UPDATE branch SET [count]=c.sl FROM (SELECT workin,sl=COUNT(1) FROM employee a,branch b WHERE a.workin=b.number GROUP BY workin) c,branch d WHERE c.workin=d.number

GO

INSERT employee VALUES('cc',1)
INSERT employee VALUES('dd',1)
INSERT employee VALUES('eee',1)
INSERT employee VALUES('aa',1)
INSERT employee VALUES('fff',2)
INSERT employee VALUES('aaa',2)
INSERT employee VALUES('aaa',2)

DELETE FROM employee WHERE [name]='cc'
DELETE FROM employee WHERE [name]='fff'

SELECT * FROM branch
SELECT * FROM employee
oO寒枫Oo 2011-03-30
  • 打赏
  • 举报
回复

create trigger trg_branch on employee after update
as
declare @add_name int
declare @delete_name int
declare @count_name int
set @add_name =0
set @delete_name =0
set @count_name =0

declare @workin varchar(100)
if exists(select 1 from inserted)
begin
select @add_name =count(1) from inserted
select @workin =workin from inserted
end
if exists(select 1 from deleted)
begin
select @delete_name =count(1) from deleted
select @workin =workin from deleted
end
set @count_name=@add_name -@delete_name
update branch set count=count+@count_name where number = @workin
nevergu 2011-03-30
  • 打赏
  • 举报
回复

update branch set count=count+1 where number=inserted.workin

update branch set count=count-1 where number=deleted.workin

oO寒枫Oo 2011-03-30
  • 打赏
  • 举报
回复
你就把触发器里面deleted 看成一张临时表就可以了 保存的是你删除的结果集
inserted是你插入的结果集
yanxiangtianji 2011-03-30
  • 打赏
  • 举报
回复
能不能说的详细一点
我还是比较菜的,唉~
[Quote=引用 2 楼 ssp2009 的回复:]
SQL code
select workin from inserted
[/Quote]
快溜 2011-03-30
  • 打赏
  • 举报
回复
select workin from inserted
快溜 2011-03-30
  • 打赏
  • 举报
回复
select workin from deleted

34,576

社区成员

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

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