David Clarke Asked: 2020-08-27 18:48:22 +0800 CST2020-08-27 18:48:22 +0800 CST 2020-08-27 18:48:22 +0800 CST sys.objects 参考的 FK 替代方案 772 我正在更新表更新时由触发器填充的审计/日志表。我的意图是sys.objects.object_id在日志表中使用表名和列名列,但不能对系统视图使用 FK 引用。是否有任何有用的替代方法来维护表上的参照完整性? sql-server foreign-key 1 个回答 Voted Best Answer Aaron Bertrand 2020-08-27T19:39:37+08:002020-08-27T19:39:37+08:00 您可以在日志表上使用触发器,当在 sys.objects 中找不到插入的 object_id 时回滚 - 因为触发器是我们在外键没有意义或不可能时使用的典型机制(例如维护跨数据库或实例边界的完整性)。 但是您真的想丢失所有数据,因为一列代表一个不再存在或从未存在的对象吗?(也许没关系;我不知道您正在审核/记录什么。)由于触发器产生 object_id,并且系统不知道会出现问题,因此发生这种情况的可能性有多大? 无论如何,我不确定我是否理解这一点。虽然 sys.objects 的外键会阻止某人记录有关不存在的对象的信息,但记录表中仅存在一行将使得不可能删除该对象。(也许这也可以,但听起来并不明智。) 如果担心某天查看日志历史记录的用户会因为对象已被删除而陷入死胡同,那么确保在插入行时对象存在的触发器无论如何都不会使您摆脱这种情况。您可能需要一个 DDL 触发器 on DROP_TABLE,以便清除与该表关联的日志历史记录,或者将 object_id 移动到其他地方,以便您仍然可以追踪该表曾经是什么。
您可以在日志表上使用触发器,当在 sys.objects 中找不到插入的 object_id 时回滚 - 因为触发器是我们在外键没有意义或不可能时使用的典型机制(例如维护跨数据库或实例边界的完整性)。
但是您真的想丢失所有数据,因为一列代表一个不再存在或从未存在的对象吗?(也许没关系;我不知道您正在审核/记录什么。)由于触发器产生 object_id,并且系统不知道会出现问题,因此发生这种情况的可能性有多大?
无论如何,我不确定我是否理解这一点。虽然 sys.objects 的外键会阻止某人记录有关不存在的对象的信息,但记录表中仅存在一行将使得不可能删除该对象。(也许这也可以,但听起来并不明智。)
如果担心某天查看日志历史记录的用户会因为对象已被删除而陷入死胡同,那么确保在插入行时对象存在的触发器无论如何都不会使您摆脱这种情况。您可能需要一个 DDL 触发器 on
DROP_TABLE
,以便清除与该表关联的日志历史记录,或者将 object_id 移动到其他地方,以便您仍然可以追踪该表曾经是什么。