假设我有一个名为MANT
的表,像这样
date state
2020-01-24 | 0
2020-01-27 | 1
而且我还有另一个名为PREC
的表,像这样
value date
0.00 | 2020-05-18
0.00 | 2020-05-19
0.00 | 2020-05-20
如果我尝试将这些值插入PREC
insert into PREC VALUES (4,'2020-01-25')
我希望这不可能,因为在表MANT
中,最古老的日期比在PREC
中插入的日期的状态为0
但是如果我插入例如:
insert into PREC VALUES (4,'2020-01-29')
已经允许。
有人建议在SQL Server中执行此操作吗?
您可以使用insert ... select
语法和相关子查询进行过滤:
insert into prec(value, date)
select v.*
from (values (4,'2020-01-25')) v(value, date)
where (select top (1) m.date from mant m where m.date <= v.date order by m.date desc) = 1
您也可以通过聚合来做到这一点:
insert into prec(value, date)
select v.*
from (values (4,'2020-01-25')) v(value, date)
where (select max(m.date) from mant m where m.date <= v.date) = 1
我相信您正在寻找引发异常的插入触发器。下面是一个示例:
CREATE OR REPLACE TRIGGER person_id_trigg
AFTER INSERT
ON person
FOR EACH ROW
BEGIN
IF( NOT EXISTS(select max(m.date) from mant m where m.date <= v.date AND state = 1) )
THEN
RAISE_APPLICATION_ERROR( -20001,
'The MANT date is invalid for PREC' );
END IF;
END;
我建议您不要直接插入。您可以通过存储过程控制它。
CREATE PROCEDURE dbo.PREC_Insert
@value INT
,@DateValue DATE
AS
BEGIN
DECLARE @maxDate DATE = (
SELECT max(DATE)
FROM PREC
)
DECLARE @errorMessage NVARCHAR(4000)
IF @Datevalue > @maxDate
BEGIN
SET @errorMessage = 'You cannot insert date value older than ' + CAST(@maxDate AS VARCHAR(12)
throw 51000, @errorMessage, 1;
END
ELSE
BEGIN
-- Do the insert
END
END
如果要允许直接插入,则可以使用AFTER INSERT触发器进行处理。