5

我有许多使用相同基础表的不同视图,但每个视图都使用不同的 FK 默认值。

所以对于我尝试的代码:

ALTER VIEW [dbo].[vwTest]
 AS
SELECT     
Id, 
C1 AS |TestCol, 
COALESCE(GroupId,3) AS GroupId 
FROM         dbo.tblTest
WHERE     (GroupId = 3)

我知道“3”是硬编码的,但会被替换。

这是我认为造成麻烦的线:

COALESCE(GroupId,3) AS GroupId 

每次将记录插入 vwTest 时,我都需要将“3”插入 tblTest.GroupId。

谢谢。

4

2 回答 2

6

在视图上创建一个代替触发器

SQL小提琴

样品表/视图

create table tblTest( id int identity, c1 varchar(10), groupid int );

create view vwtest as select c1, COALESCE(GroupId,3) GroupId 
from tblTest
where GroupID = 3;

创建触发器

CREATE TRIGGER InsteadTrigger on vwTest
INSTEAD OF INSERT
AS
BEGIN
  INSERT INTO tblTest (c1, GroupID)
       SELECT c1, 3
       FROM inserted
END;

将一些测试数据放入表/视图中

insert into tblTest( c1, groupid ) select 'row 1' ,3 ;
insert into tblTest( c1, groupid ) select 'row 2' ,1 ;
insert into vwTest(c1) select 'row 3';

看看我们得到了什么

select * from tblTest;
select * from vwTest;
于 2013-04-24T22:20:50.107 回答
1

我相信做到这一点的唯一方法是在每个视图上定义一个而不是触发器。

于 2013-04-24T21:46:52.410 回答