从可写视图写入不同的表

时间:2013-04-26 15:49:36

标签: sql-server views writable

我想写不同的表,具体取决于我的开发状态(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.

2 个答案:

答案 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的视图自动为只读的原因之一。

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

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

  2. 同义词:通过使用同义词定义View的目标。然后,当您想要切换它时,只需重新定义同义词。