4

私のプロジェクトでは、既存のテーブルをさらにいくつかの列で拡張する必要がありました。残念ながら、それを変更またはドロップ/再作成することはできないため、1:1 の関係を持つ別のテーブルを作成し、挿入/更新/削除トリガーを使用してビューにマージすることを選択しました。

これまでのところ、挿入と削除は機能しますが、Update-Trigger に問題があります。成功メッセージはさらに混乱を招きます。

ビューは次のようになります。

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_Extend] には 2 行のデータが含まれています ビューにも 23 行あります。

しかし、なぜ何も挿入されていないのですか?私は何か間違ったことをしていますか、それとも何かを忘れていますか?

4

1 に答える 1

5

次のようにトリガーを書き直してみてください。

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
于 2013-09-04T19:21:41.887 に答える