如何实现“只能通过视图插入值”?

问题描述 投票:0回答:1
  1. 我有一张表
    student (sno, sname, ssex, sage, sdept)
    ,分别是id,name,sex,age,department。
  2. 我创建了一个视图
    st_cs_info
    ,其中包含主修“CS”(计算机科学)的学生信息。
DROP VIEW IF EXISTS st_cs_info;
CREATE VIEW st_cs_info AS
SELECT *
FROM student
WHERE sdept='CS';

  1. 然后我需要实现一个功能,只能通过这个视图插入 CS 学生的值
    我尝试创建触发器,但出现如下错误:
'study.st_cs_info' is not BASE TABLE

似乎在视图上创建触发器是非法的。
这是我的触发代码

DELIMITER //
CREATE TRIGGER st_cs_info_insert
AFTER INSERT ON st_cs_info
FOR EACH ROW
BEGIN
  IF new.sdept != 'CS' THEN
    DELETE FROM student
    WHERE student.sno=new.sno;
  END IF;
END; //
DELIMITER ;

PS:我的MySQL版本是

8.0.32
.

我想实现“只能通过这个视图插入CS学生的价值观”.
此外,我不确定是否应该使用触发器。

mysql view triggers sql-insert
1个回答
0
投票

我已经知道如何检查新行了
无需创建触发器。
我需要做的就是在创建视图时使用

WITH CHECK OPTION

DROP VIEW IF EXISTS st_cs_info;
CREATE VIEW st_cs_info AS
SELECT *
FROM student
WHERE sdept='CS'
WITH CHECK OPTION;

然后当我向视图中插入新行时:

  • 如果
    sdept
    不是
    'CS'
    ,那么就会报错
INSERT INTO st_cs_info(sno, sname, ssex, sage, sdept)
VALUES ('202113002', 'John', NULL, 20, 'IS');

错误信息

CHECK OPTION failed 'study.st_cs_info'
  • 如果
    sdept
    'CS'
    ,那么它就成功了。
INSERT INTO st_cs_info(sno, sname, ssex, sage, sdept)
VALUES ('202113004', 'Kate', NULL, 20, 'CS');
© www.soinside.com 2019 - 2024. All rights reserved.