【问题标题】:Insert into view and use default values for the underlying table插入视图并使用基础表的默认值
【发布时间】:2016-05-24 07:47:24
【问题描述】:

我有一张桌子,例如Customers(CustomerType, Name) 和每个客户类型的两个视图:

create view PremiumCustomers as
(
  select Name from Customers where CustomerType = 1
);

create view NormalCustomers as
(
  select Name from Customers where CustomerType = 2
);

有没有办法可以插入到每个视图中并相应地设置CustomerType 的默认值?

例如通过使用:

INSERT INTO PremiumCustomers (name) VALUES ('foo')

('foo',2) 插入Customers 表。

【问题讨论】:

  • 替代触发器是要走的路。

标签: sql-server view sql-insert


【解决方案1】:

这样试试

CREATE TRIGGER TrPremiumCustomersInsteadTrigger on PremiumCustomers
INSTEAD OF INSERT
AS
BEGIN
  INSERT INTO Customers (Name, CustomerType)
       SELECT Name, 1
       FROM inserted
END;


CREATE TRIGGER TrNormalCustomersInsteadTrigger on NormalCustomers 
INSTEAD OF INSERT
AS
BEGIN
  INSERT INTO Customers (Name, CustomerType)
       SELECT Name, 2
       FROM inserted
END;

INSERT INTO PremiumCustomers (name) VALUES ('foo')
INSERT INTO NormalCustomers (name) VALUES ('foo')

【讨论】:

  • 那么,我必须为每个 CustomerType 触发一个触发器吗?这有任何性能问题吗?
  • @xpy - 为什么要问是否存在性能问题,因为这似乎是唯一符合您要求的解决方案?
  • 使用视图进行批量加载时可能会影响性能。
  • @Damien_The_Unbeliever 因为我可以改为插入到基础表中,或者将CustomerType 添加到视图中,并在插入时传递此值。另外,我还不相信这是唯一的解决方案。
  • @xpy - 好吧,如果您有其他不涉及插入视图并且不指定列的替代方案(这是我们可以从您的问题中推断出的唯一当前要求),所有人意味着尝试每个替代方案和race your horses
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 2015-08-25
  • 1970-01-01
相关资源
最近更新 更多