Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 防止根据其他表插入值_Sql_Sql Server_Tsql_Join_Sql Insert - Fatal编程技术网

Sql 防止根据其他表插入值

Sql 防止根据其他表插入值,sql,sql-server,tsql,join,sql-insert,Sql,Sql Server,Tsql,Join,Sql Insert,假设我有一张像这样叫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中插入这些值 我希望这是不可能的,因为在表MANT中,插入PREC的最早日期中的state=0 但如果我插入例如: inse

假设我有一张像这样叫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中插入这些值

我希望这是不可能的,因为在表MANT中,插入PREC的最早日期中的state=0

但如果我插入例如:

insert into PREC VALUES (4,'2020-01-29') 
这已经被允许了

有人建议在SQL Server中执行此操作吗?

您可以使用插入。。。选择用于筛选的语法和相关子查询:

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;

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

创建过程dbo.PREC_Insert @值INT ,@DateValue日期 像 开始 声明@maxDate日期= 选择maxDATE 来自PREC 声明@errorMessage NVARCH4000 如果@Datevalue>@maxDate 开始 SET@errorMessage='不能插入比'+CAST@maxDate如瓦查尔12 抛出51000,@errorMessage,1; 终止 其他的 开始 -插入 终止 终止
如果您想允许直接插入,可以使用插入后触发器来处理它。

我认为问题是针对SQL Server RDBMS的。您的答案可能与RDBMS不同
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;