Sql 使用触发器更新/插入视图
在我的项目中,我不得不用更多的列扩展现有的表。不幸的是,我无法更改或删除/重新创建它,所以我选择创建另一个具有1:1关系的表,并在具有Insert/Update/Delete触发器的视图中合并它们 到目前为止,insert和Delete仍然有效,但我对Update触发器有一些问题。成功的信息更令人困惑 视图如下所示:Sql 使用触发器更新/插入视图,sql,triggers,sql-server-2012,sql-view,Sql,Triggers,Sql Server 2012,Sql View,在我的项目中,我不得不用更多的列扩展现有的表。不幸的是,我无法更改或删除/重新创建它,所以我选择创建另一个具有1:1关系的表,并在具有Insert/Update/Delete触发器的视图中合并它们 到目前为止,insert和Delete仍然有效,但我对Update触发器有一些问题。成功的信息更令人困惑 视图如下所示: Create View [dbo].[JoinedGroups] as SELECT [dbo].[MaterialGroups].[GroupID] ,[Name]
Create View [dbo].[JoinedGroups] as
SELECT [dbo].[MaterialGroups].[GroupID]
,[Name]
,[SupGroup_ID]
,[ExtGroup_ID]
FROM [dbo].[MaterialGroups]
left outer join [dbo].[MaterialGroups_Extend]
ON [dbo].[MaterialGroups].[GroupID]=[dbo].[MaterialGroups_Extend].[GroupID]
如前所述,新的附加表尚未填充,这就是左侧外部联接的原因,但是如果您有不同的想法,请告诉我
触发因素:
CREATE TRIGGER [dbo].[UpdateTriggerJG] ON [dbo].[JoinedGroups]
INSTEAD OF Update
AS
BEGIN
IF EXISTS (SELECT * FROM [dbo].[MaterialGroups_Extend] E,inserted I WHERE E.[GroupID] = I.[GroupID])
BEGIN
UPDATE [dbo].[MaterialGroups_Extend]
SET [SupGroup_ID] = I.[SupGroup_ID]
,[ExtGroup_ID] = I.[ExtGroup_ID]
FROM [Buran].[dbo].[MaterialGroups_Extend] E,inserted I
WHERE E.[GroupID] = I.[GroupID]
END
ELSE
BEGIN
INSERT INTO [dbo].[MaterialGroups_Extend]
([GroupID]
,[SupGroup_ID]
,[ExtGroup_ID])
SELECT [GroupID]
,[SupGroup_ID]
,[ExtGroup_ID]
FROM inserted
END
UPDATE [dbo].[MaterialGroups]
SET [dbo].[MaterialGroups].[Name] = I.Name
FROM [dbo].[MaterialGroups],inserted I
WHERE [dbo].[MaterialGroups].[GroupID] = I.[GroupID]
这样的陈述:
UPDATE [dbo].[JoinedGroups]
SET
[SupGroup_ID] = 1
,[ExtGroup_ID] = 1
提供以下输出:
(2 row(s) affected)
(23 row(s) affected)
(23 row(s) affected)
这有点有趣:
[MaterialGroups]包含23行数据
[MaterialGroups\u Extend]包含两行数据
该视图也有23个
但为什么没有插入任何内容?我是做错了什么还是忘记了什么?试着重写你的触发器,比如:
CREATE TRIGGER [dbo].[UpdateTriggerJG] ON [dbo].[JoinedGroups]
INSTEAD OF Update
AS
begin
update dbo.MaterialGroups_Extend set
SupGroup_ID = I.SupGroup_ID,
ExtGroup_ID = I.ExtGroup_ID
from dbo.MaterialGroups_Extend as E
inner join inserted I on I.GroupID = E.GroupID
insert into dbo.MaterialGroups_Extend
(
GroupID,
SupGroup_ID,
ExtGroup_ID
)
select
GroupID,
SupGroup_ID,
ExtGroup_ID,
from inserted as i
where
not exists
(
select *
from dbo.MaterialGroups_Extend as E
where E.GroupID = I.GroupID
)
update dbo.MaterialGroups set
Name = I.Name
from dbo.MaterialGroups as MG
inner join inserted I on I.GroupID = MG.GroupID
end
一个有趣的解决方案,我现在就尝试,等一下。。。我可以问几个问题吗为什么要使用内部联接,而不是像我一样使用常规的表列表?我对Oracle有更多的经验,如果不使用联接,性能会更好。-你知道为什么我的解决方案不起作用吗?这只是命令还是我监督了什么?