如何实现视图ID1从False变为True时自动插入ID2/ID3值到新表
实现方案
前提说明
- 从你提供的
dbo前缀语法判断属于SQL Server环境,视图本身是虚拟表不存储数据,无法直接创建触发器,需要在视图View1依赖的底层基表上创建AFTER UPDATE触发器 - 你原有的查询存在语法冗余和笔误,优化后的ID2、ID3取值语句更简洁的写法如下:
SELECT (SELECT Value FROM dbo.View1 WHERE ID = 2) AS ID2_Value, (SELECT Value FROM dbo.View1 WHERE ID = 3) AS ID3_Value
完整实现代码
假设你新建的存储表名为TargetTable,结构为(ID INT, Value [对应字段类型]),触发器代码如下:
CREATE TRIGGER trg_CheckID1StateChange ON 替换为View1依赖的底层基表名 -- 此处替换为视图对应的实际基表名称 AFTER UPDATE AS BEGIN SET NOCOUNT ON; -- 仅检测ID1从False变为True的状态变化 IF EXISTS( SELECT 1 FROM deleted d INNER JOIN inserted i ON d.ID = i.ID WHERE d.ID = 1 AND d.Value = 0 -- 若为原生布尔类型替换为FALSE AND i.Value = 1 -- 若为原生布尔类型替换为TRUE ) BEGIN -- 将当前ID2、ID3的值插入目标表(两行数据,对应ID2、ID3各一行) INSERT INTO TargetTable (ID, Value) SELECT ID, Value FROM dbo.View1 WHERE ID IN (2,3) -- 如果你需要把ID2、ID3的值存为同一行,可替换为下方插入逻辑,需同步调整目标表结构 /* INSERT INTO TargetTable (ID2_Value, ID3_Value) SELECT (SELECT Value FROM dbo.View1 WHERE ID = 2), (SELECT Value FROM dbo.View1 WHERE ID = 3) */ END END GO
注意事项
- 如果
View1关联了多个基表,需要在所有可能修改ID1对应Value的基表上都创建该触发器 - 请根据你实际的Value字段类型调整判断条件的取值
内容的提问来源于stack exchange,提问作者Derbel Aroussi
相关产品推荐
相关产品推荐

