阻止根据另一个表插入值

bybem2ql  于 2021-08-09  发布在  Java
关注(0)|答案(3)|浏览(329)

假设我有一张table叫 MANT 这样地

date           state
2020-01-24  |   0
2020-01-27  |   1

我还有一张table叫 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')

我希望这是不可能的,因为在table上 `MANT` ,在插入日期的最早日期中状态为0 `PREC` 但如果我插入例如:

insert into PREC VALUES (4,'2020-01-29')

这已经被允许了。
有人建议在SQLServer中这样做吗?
92vpleto

92vpleto1#

你可以用这个 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
kqlmhetl

kqlmhetl2#

我相信您正在寻找引发异常的插入触发器。例如:

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;
slwdgvem

slwdgvem3#

我建议您不要允许直接插入。您可以通过存储过程来控制它。

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触发器来处理。

相关问题