如何找到要删除的测试数据表的依赖顺序列表?

时间:2010-10-18 20:41:28

标签: sql hibernate annotations foreign-keys hibernate-annotations

我有一个测试套件,需要删除本地MySQL测试实例中的任何现有数据,用于系统中的大量(但不是全部)表。

 delete from customer;

当然,customer有很多外键,所以我还要删除几个表......

 delete from customer_email;
 delete from customer_phone;

再次,这些表有更多的外键......

 delete from customer_email_notification;
 delete from customer_phone_call;

等等广告恶心。为了编写测试设置,必须精神导航整个数据模型是令人沮丧的。

我正在使用Hibernate所以我想知道是否有某种方法可以自动获取表的优先级顺序列表,以便它可以直接传递给删除处理程序。理想的情况是:

 List<String> dependentTables = foreignKeyGraph.findAll("customer");
 deletionHandler.clean(dependentTables);

是否有可以执行此操作的Hibernate实用程序?我打算用这种方式编写一些遍历我们域名注释和派生表名称的东西,但对于一个相当常见的问题似乎有很多工作要做。谢谢!

2 个答案:

答案 0 :(得分:1)

您可能会发现此处找到的代码非常有用....我做到了!它遍历所有sql数据库外键并以正确的顺序构建一个delete语句列表。它的sql server代码 - 我假设我的sql中有类似的工具,所以这个技术可以移植。

http://www.jasinskionline.com/TechnicalWiki/List-Tables-in-Dependency-Order-SQL-Server.ashx?AspxAutoDetectCookieSupport=1

答案 1 :(得分:0)

处理此问题的一种好方法是在每个表上使用DELETE触发器。在CUSTOMER表上,将触发删除所有相关数据,这些数据是通过跟随与给定CUSTOMER_ID相关的每个外键返回的CUSTOMER_ID - 同样对于与CUSTOMER相关的每个表 - 以及与这些表相关的每个表等。例如,如果CUSTOMER_EMAIL表通过CUSTOMER_ID与CUSTOMER相关,同样CUSTOMER_PHONE,那么CUSTOMER上的删除触发器可能看起来像

CREATE TRIGGER CUSTOMER_AD  -- AD = After Delete
  AFTER DELETE ON CUSTOMER
  FOR EACH ROW
BEGIN
  DELETE FROM CUSTOMER_EMAIL E WHERE E.CUSTOMER_ID = :NEW.CUSTOMER_ID;
  DELETE FROM CUSTOMER_PHONE P WHERE P.CUSTOMER_ID = :NEW.CUSTOMER_ID;
END CUSTOMER_AD;

分享并享受。