Определите, изменяет ли SQL-запрос структуру базы данных - PullRequest
2 голосов
/ 08 декабря 2011

Я пытаюсь выяснить, содержит ли строка определенные команды SQL, которые изменяют базу данных:

  • создание новых таблиц
  • удаление существующих таблиц
  • создание новых столбцов таблицы
  • удаление существующих столбцов таблицы

Прямо сейчас я выполняю поиск strpos для ALTER, CREATE и DROP, которые должны работать.

Существуют ли какие-либо другие команды, которые выполняют вышеуказанные действия и которые я должен включить в свой поиск?

Обратите внимание, что мне это не нужно по соображениям безопасности. Мне просто нужно знать, изменилась ли схема таблицы, чтобы я мог обновить свой локальный кеш информации схемы ...

Ответы [ 3 ]

4 голосов
/ 08 декабря 2011

Это будет довольно сложно сделать с помощью проверки строк.

Существуют и другие способы внесения изменений, например:

SELECT *
INTO SomeTable
FROM SomeOtherTable

sp_rename 'OldTable' 'NewTable'

Безопасность или DDLтриггеры, вероятно, являются лучшим выбором.

4 голосов
/ 08 декабря 2011

Для некоторых СУБД (PostgreSQL, MS SQL Server, Informix) SELECT ... INTO ... может создать новую таблицу.

3 голосов
/ 08 декабря 2011

Один ложный положительный результат может произойти, если ALTER, CREATE или DROP происходят в строковой константе.

INSERT INTO News (headline) VALUES ('Stocks DROP for no reason!');

Также strpos() ищет только литеральные подстроки, он не знает, является ли подстрока частьюболее длинное слово.

SELECT * FROM CLOTHING_ALTERATIONS

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

$num_matches = preg_match("/^\s*(ALTER|CREATE|DROP|RENAME)\b/m", $sql);

Использование многострочного соответствия регулярному выражению важно, если строка содержит комментарий строки SQL.

-- the following statement is run in my add_column() function
ALTER TABLE mytable ADD COLUMN ...

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

/* added 12/7/2011 */ CREATE /* TEMPORARY */ TABLE mytable ...
...