2010-01-18 93 views
2

我已經在我的數據庫中的一個視圖中創建一個INSTEAD OF INSERT觸發器。我想知道哪些列包含在視圖的INSERT語句的列列表中。INSERT觸發器和的update()函數

如果您閱讀觸發器的MSDN文檔,則UPDATE()和COLUMNS_UPDATED()函數應滿足此要求。然而,在我的測試過程中,我發現無論INSERT列表中的列是什麼列,UPDATE()和COLUMNS_UPDATED()函數總是返回視圖中的所有列。

CREATE VIEW dbo.MyView (BatchId, [Status], OrderNumber, WhenClosed) AS 
    SELECT bth.BatchId, bth.[Status], bth.OrderNumber, 
      Private.ufxAdjustDateTime(bth.WhenClosed, bth.WhenClosedUtcOffset) 
     FROM Private.Batch AS bth 
GO 
CREATE TRIGGER dbo.[MyView-Insert] ON dbo.MyView INSTEAD OF INSERT AS 
BEGIN 
    SET NOCOUNT ON 

    DECLARE @batchIdIsSet BIT 

    SELECT @batchIdIsSet = 0 
    IF UPDATE(BatchId) 
     SELECT @batchIdIsSet = 1 

    INSERT INTO Private.Batch 
     (BatchId, [Status], OrderNumber) 
     SELECT CASE @batchIdSet 
        WHEN 1 THEN ins.BatchId 
        ELSE NEWID() 
       END, ins.[Status], ins.OrderNumber 
      FROM inserted AS ins 
END 

我想這樣做的原因是,我需要修改現有的表,我有依賴於它的舊代碼的負荷。所以我所做的是創建一個新表,將舊錶更改爲視圖並在視圖上創建觸發器,以允許INSERT,UPDATE和DELETE語句。

現在,舊錶具有默認的某些列,如果插入視圖使用默認我想在我插入到新表中使用默認值。要做到這一點,我必須能夠找出哪些列[顯式]爲INSERT提供了值。

檢查以查看列是否具有NULL是不夠的,因爲INSERT語句可以顯式設置字段值爲NULL,這是完全可以接受的。

嗯,我希望這是顯而易見的。 Kep。

回答

4

在INSERT語句,每列受到影響。它要麼是NULL,要麼是你指定的值。

檢查NULL是最好的選擇,但是因爲你不能這樣做,所以我想你可能會被卡住。你能解決可能需要明確處理NULL的場景嗎?

+0

我可能會排除一些東西。也許我會用最常見的方案去修改那些無法處理它的遺留代碼。 – Kepboy

2

對於INSERT,一切都是變化的,因爲它是一個新行。

如果您有AFTER觸發器,您可以測試以查看插入的值是否爲默認值。如果默認值爲NULL(例如可爲空且沒有默認值),那麼如何區分NULL是否明確插入到任何觸發器中?

在BEFORE觸發器,我不知道你是否可以捕獲的默認。當然,如果默認值是NEWID(),這仍然不會幫助你。

在它的面前,這不能在觸發器來完成。

相關問題