我在这里使用Delphi 5和SQL Server 2000。
我在一个带有INSTEAD OF DELETE触发器的可更新视图之上创建了一个ADOQuery。
可更新视图主要用于控制软删除。它过滤掉标记为已删除的记录,同时也隐藏了控制列。
当我向数据库发出直接DELETE命令时,一切正常。我删除视图上的记录并更新基础表,按预期进行软删除。
当我尝试使用ADOQuery删除记录时,它会绕过视图并直接在基础表上删除记录,因此视图上的“代替删除”触发器永远不会被触发。
我也在使用引用约束,删除因为它们而错误,但我不知道这是否重要。向视图发出删除命令时不会发生这种情况。
你们中的任何人都知道如何解决这种恼人的行为吗?
答案 0 :(得分:1)
请注意,它是直接从主表中删除?这可能是因为它检测到它是一个视图并使用底层表本身。要防止出现这种情况,请声明您的观看WITH VIEW_METADATA
,有关详细信息,请参阅ALTER VIEW。
然后ADO库将视图视为表。请注意,可能通过欺骗您的数据库库来获得不必要的副作用,例如在实际未执行删除或执行更新而不是删除的情况下。