--楼上几位的解答,思路基本是对的,但是不严谨!
--问题1
CREATE TRIGGER Tri1 ON 进货信息表
FOR INSERT
AS
BEGIN
IF NOT EXISTS(SELECT 图书编号 FROM 图书信息表 A INNER JOIN INSERTED B ON A.图书编号 = B.图书编号)
INSERT 图书信息表(图书编号,书名,ISDN,作者,出版社,图书类型,价格)
SELECT 图书编号,书名,ISDN,作者,出版社,图书类型,价格 FROM INSERTED
IF NOT EXISTS(SELECT 图书编号 FROM 货存信息表 A INNER JOIN INSERTED B ON A.图书编号 = B.图书编号)
INSERT 货存信息表(图书编号,书名,货存量)
SELECT 图书编号,书名,0 FROM INSERTED
UPDATE 货存信息表
SET 货存量 = A.货存量 + B.进货数量
FROM 货存信息表 A INNER JOIN INSERTED B ON A.图书编号 = B.图书编号
END
GO
--问题2 需要多个触发器来实现
CREATE TRIGGER Tri2a ON 进货信息表
AFTER UPDATE
AS
BEGIN
IF UPDATE(进货数量)
UPDATE 货存信息表
SET 货存量 = B.进货数量 - C.售出数量
FROM 货存信息表 A INNER JOIN (SELECT 图书编号,SUM(进货数量) AS 进货数量
FROM 进货信息表
GROUP BY 图书编号) AS B ON A.图书编号 = B.图书编号
INNER JOIN (SELECT 图书编号,SUM(售出数量) AS 售出数量
FROM 售书信息表
GROUP BY 图书编号) AS C ON A.图书编号 = C.图书编号
INNER JOIN INSERTED D ON A.图书编号 = D.图书编号
END
GO
CREATE TRIGGER Tri2b ON 售书信息表
FOR INSERT
AS
BEGIN
UPDATE 货存信息表
SET 货存量 = A.货存量 - B.售出数量
FROM 货存信息表 A INNER JOIN INSERTED B ON A.图书编号 = B.图书编号
END
GO
CREATE TRIGGER Tri2c ON 售书信息表
AFTER UPDATE
AS
BEGIN
IF UPDATE(售出数量)
UPDATE 货存信息表
SET 货存量 = B.进货数量 - C.售出数量
FROM 货存信息表 A INNER JOIN (SELECT 图书编号,SUM(进货数量) AS 进货数量
FROM 进货信息表
GROUP BY 图书编号) AS B ON A.图书编号 = B.图书编号
INNER JOIN (SELECT 图书编号,SUM(售出数量) AS 售出数量
FROM 售书信息表
GROUP BY 图书编号) AS C ON A.图书编号 = C.图书编号
INNER JOIN INSERTED D ON A.图书编号 = D.图书编号
END
GO
--问题3
CREATE TRIGGER Tri3 ON 图书信息表
FOR INSERT
AS
BEGIN
IF EXISTS(SELECT 图书编号 FROM 图书信息表 A INNER JOIN INSERTED B ON A.图书编号 = B.图书编号)
UPDATE 图书信息表
SET 书名 = B.书名 ,
IDSN = B.IDSN ,
作者 = B.作者 ,
出版社 = B.出版社 ,
图书类型 = B.图书类型 ,
价格 = B.价格
FROM 图书信息表 A INNER JOIN INSERTED B ON A.图书编号 = B.图书编号
END
GO
/*
另外,觉得你几个表结构设计的很不合理。
你这不过是一图书进销存系统的几个基本表嘛,我是做商场进销存系统的
建议你的表结构如下:
图书信息表(图书编号、图书类型、图书名称、IDSN、作者、出版社、进价、售价、库存量);
进货信息表(图书编号、进货量);
售书信息表(图书编号、出货量);
另外,触发器处理数据代价昂贵,效率底下,建议少用!
QQ:316784428 SQL爱好者,相互交流,共同进步!
*/
改了一点点:
1.create trigger NewInfo on 进货信息表 for insert as
insert 图书信息表 (图书编号,书名,ISDN,作者,出版社,图书类型,价格) select 图书编号,书名,ISDN,作者,出版社,图书类型,价格 from inserted
update 货存信息表 set 货存量=B.进货量-C.售出数量 from 货存信息表 A inner join 进货信息表 B on A.图书编号=B.图书编号 inner join 售书情况表 C on A.图书编号=C.图书编号 where A.图书编号=(select 图书编号 from inserted)
2.create trigger Saled on 售书情况表 for update as
declare @sale int,@id varchar(20) --假设你的图书编号是varchar(20)
if update(售出数量)
begin
select @sale=售出数量,@id=图书编号
update 货存信息表 set 货存量=B.进货量-@sale from 货存信息表 A inner join 进货信息表 B on A.图书编号=B.图书编号 where A.图书编号=@id
end
3.create trigger NewRec on 图书信息表 for insert as
declare @id varchar(20)
select @id=图书编号 from inserted
if exists(select * from 图书信息表 where 图书编号=@id)
update 图书信息表 set 图书编号=A.图书编号,书名=A.书名,ISDN=A.ISDN,作者=A.作者,出版社=A.出版社,图书类型=A.图书类型,价格=A.价格 from 图书信息表 B inner join inserted A on B.图书编号=A.图书编号 where B.图书编号=@id
1
create trigger trigger1
on 进货表
for insert
as
declare @id int
declare @name varchar(50)
declare @isdn int
declare @zuozhe varchar(20)
declare @chubanshe varchar(200)
declare @leixing varchar(100)
declare @price money
declare @shuliang int
begin
select @id=图书编号,@name=书名,@isdn=isdn,@zuozhe=作者,@chubanshe=出版社,@leixing=图书类型,@price=价格,@shuliang=进货数量 from inserted
insert into图书信息表 values (@id,@name,@isdn,@zuozhe,@chubanshe,@leixing,@jiage)
end
3.
create trigger trigger3
on 图书信息表
for insert
as
declare @id int
begin
select @id=图书编号 from inserted
if @id in(select 图书编号 from 图书信息表)
rollback
end
第2个触发器 感觉有点问题额。。如果进货表的数量是增加了,你的货存量也是进货量-售出数量?你的意思是不是如果售书表的数量发生改变 货存量=进货量-售出数量啊
Create Trigger tig_Name On 进货信息表 After insert
As
Insert Into 图书信息表values(````````)
之后同理```````````
触发器建议不是必要时不要使用,可通过存储过程封装业务逻辑实现要求的效果。