0

我想根据我的开发状态(b=backup,t=testing)写入不同的表。

显示问题的最小示例如下:

SELECT s.Monat FROM (
SELECT 'b' as mode, * FROM [BACKUP].IstMonat
UNION 
SELECT 't' as mode, * FROM [TESTING].IstMonat
) s
where s.mode = 't' -- in the real world discovered by a sub query.

我怎样才能创建这样一个实际上可写的视图?

目前 ...

INSERT INTO TestView(Monat) VALUES (1);

... 结果是 ...

Msg 4406, Level 16, State 1, Line 1
Update or insert of view or function 'TestView' failed because it contains a derived or constant field.
4

2 回答 2

2

我用以下方法解决了它:

CREATE TRIGGER ModifyAllSynonyms ON [IMPORT].ImpIstMonat
INSTEAD OF INSERT
AS
IF ( EXISTS (SELECT * FROM dbo.ModeSwitch WHERE mode = 'backup') )
INSERT INTO [BACKUP].IstMonat 
SELECT * FROM inserted
ELSE
INSERT INTO [TESTING].IstMonat
SELECT * FROM inserted
于 2013-04-28T14:19:28.893 回答
1

(非索引)视图在运行时不能有两个潜在的可写表目标。这就是其中的视图UNION自动为只读的原因之一。

我只能想到两种可以做到这一点的方法:

  1. 视图触发器:创建一个带有INSTEAD OF触发器的视图,该触发器按程序决定要写入哪个表,(我不记得这是否必须是索引视图),或者......

  2. 同义词:通过使用同义词定义视图的目标。然后当你想切换它时,只需重新定义同义词即可。

于 2013-04-26T15:57:22.200 回答