ERP系统中触发器问题

yjdxboss 2017-06-13 10:36:04
表名:PURTB
此表的内容大部分是通过LRP计算插入,有小部分是手工录。
要求:
1:在插入数据时把插入TB009的数据同时也插入UDF51。
2:在修改TB009的数据时把原来插入UDF51的作为标准,TB009不得大于UDF51数量的 10%。
...全文
661 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
shinger126 2017-07-18
  • 打赏
  • 举报
回复
贴表结构和几行数据,然后说明要怎么触发
shinger126 2017-06-13
  • 打赏
  • 举报
回复
引用 2 楼 MKLsweet 的回复:
CREATE TRIGGER purtb_a ON PURTB
AFTER INSERT ,UPDATE
AS
BEGIN
DECLARE	@TB009     ,
		@UDF51     ----自己补充数据类型
IF EXISTS(SELECT 1 FROM INSERTED) AND NOT EXISTS(SELECT 1 FROM DELETED) --INSERT
	BEGIN
	UPDATE  INSERTED SET UDF51=TB009
	END
IF EXISTS(SELECT 1 FROM INSERTED) AND  EXISTS(SELECT 1 FROM DELETED) --UPDATE
BEGIN
	IF UPDATE(TB009)
	BEGIN
	   SELECT @UDF51=UDF51 FROM DELETED
	   SELECT @TB009=TB009 FROM INSERTED
		IF TB009>(@UDF01*0.1)
		ROLLBACK TRAN;
	END
END
END
引用 2 楼 MKLsweet 的回复:
CREATE TRIGGER purtb_a ON PURTB
AFTER INSERT ,UPDATE
AS
BEGIN
DECLARE	@TB009     ,
		@UDF51     ----自己补充数据类型
IF EXISTS(SELECT 1 FROM INSERTED) AND NOT EXISTS(SELECT 1 FROM DELETED) --INSERT
	BEGIN
	UPDATE  INSERTED SET UDF51=TB009
	END
IF EXISTS(SELECT 1 FROM INSERTED) AND  EXISTS(SELECT 1 FROM DELETED) --UPDATE
BEGIN
	IF UPDATE(TB009)
	BEGIN
	   SELECT @UDF51=UDF51 FROM DELETED
	   SELECT @TB009=TB009 FROM INSERTED
		IF TB009>(@UDF01*0.1)
		ROLLBACK TRAN;
	END
END
END
inserted表是不可update的,另外,没有begin tran和commit,如果发生回滚,会报错。 楼主的需求都没描述清楚啊
monkerly_asser 2017-06-13
  • 打赏
  • 举报
回复
不好意思,最下面的UDF51写成UDF01了...
yjdxboss 2017-06-13
  • 打赏
  • 举报
回复
同在一张表上面的。 只在PURTB上面做触发器。
monkerly_asser 2017-06-13
  • 打赏
  • 举报
回复
CREATE TRIGGER purtb_a ON PURTB
AFTER INSERT ,UPDATE
AS
BEGIN
DECLARE	@TB009     ,
		@UDF51     ----自己补充数据类型
IF EXISTS(SELECT 1 FROM INSERTED) AND NOT EXISTS(SELECT 1 FROM DELETED) --INSERT
	BEGIN
	UPDATE  INSERTED SET UDF51=TB009
	END
IF EXISTS(SELECT 1 FROM INSERTED) AND  EXISTS(SELECT 1 FROM DELETED) --UPDATE
BEGIN
	IF UPDATE(TB009)
	BEGIN
	   SELECT @UDF51=UDF51 FROM DELETED
	   SELECT @TB009=TB009 FROM INSERTED
		IF TB009>(@UDF01*0.1)
		ROLLBACK TRAN;
	END
END
END
二月十六 版主 2017-06-13
  • 打赏
  • 举报
回复
表结构以及表之间的关联是什么样?
monkerly_asser 2017-06-13
  • 打赏
  • 举报
回复
引用 8 楼 sinat_28984567 的回复:
CREATE TRIGGER PURTBUpdate ON PURTB
INSTEAD OF UPDATE
as
BEGIN
DECLARE @UDF51 INT
DECLARE @TB009 INT
SET @UDF51 = (SELECT TOP 1 UDF51 FROM PURTB WHERE id =( SELECT TOP 1 id FROM Inserted))
SET @TB009 = (SELECT TOP 1 TB009 FROM Inserted)
IF @TB009>@UDF51*0.1
BEGIN
raiserror('错误',16,8)
    rollback tran
END
ELSE
UPDATE PURTB SET TB009=@TB009 WHERE id=( SELECT TOP 1 id FROM Inserted)
END
UPDATE dbo.PURTB SET TB009=100 WHERE id=2
SELECT * FROM dbo.PURTB
如果修改表的时候修改了多条记录。感觉这样写不太妥当
monkerly_asser 2017-06-13
  • 打赏
  • 举报
回复
引用 7 楼 sinat_28984567 的回复:
CREATE TRIGGER PURTBInsert ON PURTB
INSTEAD OF INSERT
as
BEGIN
INSERT INTO PURTB
        ( TB009, UDF51 )
VALUES  ( (SELECT TOP 1 TB009 FROM Inserted), -- TB009 - int
          (SELECT TOP 1 TB009 FROM Inserted)  -- UDF51 - int
          )   
END
--测试数据
if not object_id(N'Tempdb..PURTB') is null
	drop table PURTB
Go
Create table PURTB(id INT IDENTITY,[TB009] int,[UDF51] int)
Go
--测试数据结束
INSERT INTO dbo.PURTB
        ( TB009 )
VALUES  ( 1
          )
SELECT * FROM dbo.PURTB
厉害
二月十六 版主 2017-06-13
  • 打赏
  • 举报
回复
CREATE TRIGGER PURTBUpdate ON PURTB
INSTEAD OF UPDATE
as
BEGIN
DECLARE @UDF51 INT
DECLARE @TB009 INT
SET @UDF51 = (SELECT TOP 1 UDF51 FROM PURTB WHERE id =( SELECT TOP 1 id FROM Inserted))
SET @TB009 = (SELECT TOP 1 TB009 FROM Inserted)
IF @TB009>@UDF51*0.1
BEGIN
raiserror('错误',16,8)
rollback tran
END
ELSE
UPDATE PURTB SET TB009=@TB009 WHERE id=( SELECT TOP 1 id FROM Inserted)
END


UPDATE dbo.PURTB SET TB009=100 WHERE id=2
SELECT * FROM dbo.PURTB


二月十六 版主 2017-06-13
  • 打赏
  • 举报
回复
CREATE TRIGGER PURTBInsert ON PURTB
INSTEAD OF INSERT
as
BEGIN
INSERT INTO PURTB
( TB009, UDF51 )
VALUES ( (SELECT TOP 1 TB009 FROM Inserted), -- TB009 - int
(SELECT TOP 1 TB009 FROM Inserted) -- UDF51 - int
)
END


--测试数据
if not object_id(N'Tempdb..PURTB') is null
drop table PURTB
Go
Create table PURTB(id INT IDENTITY,[TB009] int,[UDF51] int)
Go
--测试数据结束
INSERT INTO dbo.PURTB
( TB009 )
VALUES ( 1
)
SELECT * FROM dbo.PURTB


monkerly_asser 2017-06-13
  • 打赏
  • 举报
回复
引用 5 楼 shinger126 的回复:
[quote=引用 2 楼 MKLsweet 的回复:]
CREATE TRIGGER purtb_a ON PURTB
AFTER INSERT ,UPDATE
AS
BEGIN
DECLARE	@TB009     ,
		@UDF51     ----自己补充数据类型
IF EXISTS(SELECT 1 FROM INSERTED) AND NOT EXISTS(SELECT 1 FROM DELETED) --INSERT
	BEGIN
	UPDATE  INSERTED SET UDF51=TB009
	END
IF EXISTS(SELECT 1 FROM INSERTED) AND  EXISTS(SELECT 1 FROM DELETED) --UPDATE
BEGIN
	IF UPDATE(TB009)
	BEGIN
	   SELECT @UDF51=UDF51 FROM DELETED
	   SELECT @TB009=TB009 FROM INSERTED
		IF TB009>(@UDF01*0.1)
		ROLLBACK TRAN;
	END
END
END
引用 2 楼 MKLsweet 的回复:
CREATE TRIGGER purtb_a ON PURTB
AFTER INSERT ,UPDATE
AS
BEGIN
DECLARE	@TB009     ,
		@UDF51     ----自己补充数据类型
IF EXISTS(SELECT 1 FROM INSERTED) AND NOT EXISTS(SELECT 1 FROM DELETED) --INSERT
	BEGIN
	UPDATE  INSERTED SET UDF51=TB009
	END
IF EXISTS(SELECT 1 FROM INSERTED) AND  EXISTS(SELECT 1 FROM DELETED) --UPDATE
BEGIN
	IF UPDATE(TB009)
	BEGIN
	   SELECT @UDF51=UDF51 FROM DELETED
	   SELECT @TB009=TB009 FROM INSERTED
		IF TB009>(@UDF01*0.1)
		ROLLBACK TRAN;
	END
END
END
inserted表是不可update的,另外,没有begin tran和commit,如果发生回滚,会报错。 楼主的需求都没描述清楚啊[/quote]没试过在inserted更新,不知道这个知识点,学习了。不知道用instead of 触发器可以实现不?另外,我第一个begin 就是begin tran的意思,在ERP里回滚直接就保存不了吧

34,590

社区成员

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

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