Как проверить, что оператор SQL CREATE TABLE эквивалентен существующей таблице? - PullRequest
2 голосов
/ 26 января 2010

Для каждой таблицы в моей базе данных MySQL у меня есть файл mytablename.sql, который содержит оператор CREATE TABLE для этой таблицы.

Я хочу добавить тест, чтобы убедиться, что никто не добавил / не изменил столбец в действующей базе данных без обновления этого файла - что я хочу проверить, что я могу заново создать пустую базу данных, используя эти сценарии.

Как я могу сделать это надежно?

Один из вариантов будет использовать SHOW COLUMNS FROM mytable (или DESCRIBE mytable), который в командной строке выведет в виде таблицы:

+---------+------------------+------+-----+---------------------+----------------+
| Field   | Type             | Null | Key | Default             | Extra          |
+---------+------------------+------+-----+---------------------+----------------+
| pk_guid | int(10) unsigned | NO   | PRI | NULL                | auto_increment | 
| d_start | datetime         | NO   | MUL | 0000-00-00 00:00:00 |                | 
| d_end   | datetime         | NO   | MUL | 0000-00-00 00:00:00 |                | 
+---------+------------------+------+-----+---------------------+----------------+

А затем создайте временную таблицу и сравните результаты.

Это было бы хорошо, за исключением того, что если какие-либо столбцы были добавлены в оперативную базу данных, то результаты могут быть не в том же порядке строк.

К сожалению, невозможно использовать ORDER BY с SHOW COLUMNS.

Другой вариант - использовать SHOW CREATE TABLE, но он включает в себя такую ​​информацию, как значение счетчика AUTO_INCREMENT, которая меня не волнует.

Есть ли лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 26 января 2010

В прошлом я делал это, используя сценарий PHP с гетто / клейкой лентой на серверах баз данных (настройка dev / production). Если у вас есть 2 сервера, и один из них «правильный»:

  • захватить список столбцов для каждой таблицы, чтобы проверить. SHOW CREATE TABLE работает, или просто SELECT * FROM x LIMIT 1, если вас не интересуют возможно измененные типы данных / значения по умолчанию.
  • array_sort () присваивает имена полям в алфавитном порядке и просматривает каждое из них, сравнивая любые возможные изменения, которые вас интересуют.

Не рекомендую, хотя! Я использовал это, потому что системные администраторы ничего не думали о предоставлении полных разрешений дБ некоторым сторонним специалистам, поэтому это была просто быстрая сеть безопасности, ничем не запланированная или постоянная, как модульные тесты.


Более элегантный и понятный способ сделать это (хотя и ограниченный MySQL5 +?) - использовать системную базу данных information_schema, в частности таблицу COLUMNS. Если у вас нет 2 серверов, то будет работать и отдельная база данных для хранения / копирования информации о столбце (например, клон information_schema с последней «правильной» схемой). Это позволит вам различать новые / удаленные таблицы, индексы, триггеры, процедуры, пользователей / разрешения и т. Д.

1 голос
/ 26 января 2010

Вы писали:

Одна опция будет использовать SHOW COLUMNS ... в командной строке .... [но столбцы] могут быть не в том же порядке строк.

Вы можете форсировать этот порядок, post hoc . В UNIX-системе вы можете просто:

$ mysql -Bse 'SHOW COLUMNS FROM possibly_altered' | sort

и сравните это с аналогичным образом отсортированным и отсортированным выводом SHOW для временной таблицы, созданной вашим файлом .sql. (-Bs подавляет некоторые из этих mysql (1) причудливого форматирования и заголовков, которые не нужны и несколько неудобны для более программного сравнения.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...