向表中插入数据时其中的一列的数值不能超过另外一列,用触发器应该怎么写
首先触发器的条件得是before insert
然后你取两个列的old值比较
如果超过了,你是修改其中一列还是取消插入,看你要求
参考下面,改写下咯
create trigger limitValue
before insert on tableXXX
for each row
begin
declare mesg varchar(10)
if new.xxx < new.xxx then
set mesg='插入成功';
else select A002 into mesg;
end if
end
按照你的要求,你的触发器应该用before的了,插入前,先判定两个列的大小,符合条件则不干预插入过程,插入成功,否则就看你的需求是取消插入还算改值再插入了
创建触发器语法可以参考下这个http://t.csdn.cn/SGmEx
create or replace trigger TRI_testab
before insert on testtable
for each row
declare
PRAGMA AUTONOMOUS_TRANSACTION;
begin
if :new.a>new.b
then
RAISE_APPLICATION_ERROR (- 20005, 'a字段大于b的值禁止操作' )
end if;
end TRI_testab ;
给你写个标准的示例
create trigger checkLimit
on tb
after insert
as
begin
select @id=id,@limit1=limit1,l@imit2=limit2 from inserted
if @limit1>@limit2
print '数值不能大于limit2,事务回滚'
rollback transaction
end
其实很简单,查询下inserted表中,是否有col1>col2的情况就行了。inserted是个表,批量插入、修改时里面有多条。
效果如下图:
代码如下:
/****** Object: Table [dbo].[TestTable] Script Date: 2022/11/25 9:19:16 ******/
CREATE TABLE [dbo].[TestTable](
[Id] [int] IDENTITY(1,1) NOT NULL,
[col1] [int] NOT NULL,
[col2] [int] NOT NULL,
CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TRIGGER [dbo].[OnTestTableInsert]
ON [dbo].[TestTable]
AFTER INSERT,UPDATE
AS
IF (ROWCOUNT_BIG() = 0)
RETURN;
IF EXISTS (SELECT 1
FROM inserted where col1>col2
)
BEGIN
RAISERROR ('col1超过col2', 16, 1);
ROLLBACK TRANSACTION;
RETURN
END
题主最好再明确一下要求的表达。
1.是向表插入一行数据,本次插入的记录中的a<=b。
2.是a<=max(b)表中已有b的最大值。
猜测题主可能是2,
如果1的话,数据录入时程序判断即可踢出,无需查表内值。
CREATE TRIGGER [dbo].[course_insert] ON [dbo].[student]
FOR insert
AS
Begin
DECLARE @id1 int,@id2 int
SELECT @id1= xx.id1,@id2=xy.id2 FROM xx,xx
if(xx.id<xy.id)
PRINT '无法修改'
RETURN
End
GO
SQL|数据插入|触发器
https://blog.csdn.net/flystar27/article/details/119854160