我想写不同的表,具体取决于我的开发状态(b =备份,t =测试)。
显示问题的最小示例如下:
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.
答案 0 :(得分: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
答案 1 :(得分:1)
(非索引)View在运行时不能有两个可能可写的表目标。这是其中UNION
的视图自动为只读的原因之一。
我只能想到两种可以做到这一点的方法:
查看触发器:创建一个带有INSTEAD OF
触发器的视图,该触发器在程序上决定要写入哪个表,(我不记得是否必须是索引视图),或者...... < / p>
同义词:通过使用同义词定义View的目标。然后,当您想要切换它时,只需重新定义同义词。