ADOQuery绕过而不是删除触发器

时间:2010-09-23 20:15:13

标签: sql-server delphi sql-server-2000 triggers

我在这里使用Delphi 5和SQL Server 2000。

我在一个带有INSTEAD OF DELETE触发器的可更新视图之上创建了一个ADOQuery。

可更新视图主要用于控制软删除。它过滤掉标记为已删除的记录,同时也隐藏了控制列。

当我向数据库发出直接DELETE命令时,一切正常。我删除视图上的记录并更新基础表,按预期进行软删除。

当我尝试使用ADOQuery删除记录时,它会绕过视图并直接在基础表上删除记录,因此视图上的“代替删除”触发器永远不会被触发。

我也在使用引用约束,删除因为它们而错误,但我不知道这是否重要。向视图发出删除命令时不会发生这种情况。

你们中的任何人都知道如何解决这种恼人的行为吗?

1 个答案:

答案 0 :(得分:1)

请注意,它是直接从主表中删除?这可能是因为它检测到它是一个视图并使用底层表本身。要防止出现这种情况,请声明您的观看WITH VIEW_METADATA,有关详细信息,请参阅ALTER VIEW

然后ADO库将视图视为表。请注意,可能通过欺骗您的数据库库来获得不必要的副作用,例如在实际未执行删除或执行更新而不是删除的情况下。