I do not think what I am trying to do is possible, but I could not find any documentation on this. I have an INSTEAD OF UPDATE, INSERT, DELETE
that always inserts data into a history table before performing the DML operation. So I created triggers that performed my insert into the history table and then I created 3 IF
statements to figure out if the original operation was an INSERT
UPDATE
or DELETE
operation to continue the original operation.
Is there a way to perform my history insert and then tell SQL Server to continue with the original INSERT
, UPDATE
or DELETE
without writing those myself? See my code below. We are using the standard edition of SQL Server, so no CDC to help with logging changes. Thank you.
SET NOCOUNT ON;
-- ========================================================
-- STEP 1: ARCHIVE. Get the records that are being inserted
-- or deleted and put them in the history table
-- ========================================================
-- INSERT INTO HISTORY TABLE HERE
-- ========================================================
-- STEP: CONTINUE. After archiving, perform the requested
-- manipulation
-- ========================================================
IF(EXISTS(SELECT * FROM inserted) AND NOT EXISTS(SELECT * FROM deleted))
BEGIN
-- Perform insert into production table
END
IF(EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted))
BEGIN
-- Perform update on production table
END
IF(NOT EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted))
-- Perform delete on production table
END
Best Answer
Posting this as an answer to address the core question:
No, it is not possible to have an
INSTEAD OF
trigger just perform the original DML for you. This is why they are calledINSTEAD OF
and notBEFORE
- they replace the original action with whatever logic you want to perform, which may or may not include DML against the original target table, depending on the scenario (you may want to prevent the insert instead of rolling it back, you may be migrating to a new table and using this as an interim solution, you may have distributed or otherwise not-directly-updateable views, etc).If you feel you have a valid use case for
INSTEAD OF
, then you will have to manually code the DML they're replacing. I don't think you do, so, as the others have suggested, use anAFTER
trigger.