Как найти список порядка зависимостей таблиц для удаления для тестовых данных? - PullRequest
1 голос
/ 19 октября 2010

У меня есть набор тестов, который должен удалить все существующие данные в моем локальном тестовом экземпляре 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 ]

1 голос
/ 11 октября 2013

Вы можете найти код, найденный здесь, очень полезным .... Я сделал! Он просматривает все внешние ключи баз данных sql и формирует список операторов удаления в правильном порядке. Его код для сервера sql - я предполагаю, что в моем sql есть аналогичные средства, поэтому методика может быть перенесена.

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

0 голосов
/ 19 октября 2010

Хороший способ справиться с этим - использовать триггеры DELETE для каждой таблицы.В таблице CUSTOMER будет триггер для удаления всех найденных связанных данных путем следования каждому внешнему ключу, который относится к CUSTOMER для данного CUSTOMER_ID - аналогично для каждой таблицы, связанной с CUSTOMER, - и каждой таблицы, связанной с этими таблицами и т. Д.например, если таблица CUSTOMER_EMAIL связана с CUSTOMER через CUSTOMER_ID, а также 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;

Поделиться и наслаждаться.

...