我已在数据库中的 View 上创建了 INSTEAD OF INSERT 触发器。我想知道 View 上的 INSERT 语句的列列表中包含哪些列。
如果您阅读有关触发器的 MSDN 文档,则 UPDATE() 和 COLUMNS_UPDATED() 函数应该满足此要求。但是,在测试过程中,我发现无论 INSERT 列列表中有哪些列,UPDATE() 和 COLUMNS_UPDATED() 函数始终返回 View 中的所有列。
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
我想要这样做的原因是我需要修改现有的表,并且我有大量依赖于它的遗留代码。所以我所做的就是创建一个新表,将旧表更改为 View ,并在 View 上创建触发器,以允许 INSERT、UPDATE 和 DELETE 语句。
现在,旧表对某些列有默认值,如果插入 View 使用默认值,我想在插入新表时使用默认值。为此,我必须能够找出哪些列[显式]为 INSERT 提供了值。
检查列是否有 NULL 是不够的,因为 INSERT 语句可以显式地将字段值设置为 NULL,这是完全可以接受的。
嗯,我希望这是清楚的。 保持。
最佳答案
在 INSERT 语句中,每一列都会受到影响。它要么获取 NULL,要么获取您指定的值。
检查 NULL 将是最好的选择,但由于你不能这样做,我认为你可能会有点卡住。您能找出可能需要显式处理 NULL 的场景吗?
关于sql-server - INSERT TRIGGERS 和 UPDATE() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2083910/