我已經在我的數據庫中的一個視圖中創建一個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。
我可能會排除一些東西。也許我會用最常見的方案去修改那些無法處理它的遺留代碼。 – Kepboy