确定SQL查询是否会更改数据库结构

时间:2011-12-07 20:04:29

标签: php sql string strpos

我试图找出一个字符串是否包含某些通过以下方式更改数据库的SQL命令:

  • 创建新表
  • 删除现有表格
  • 创建新的表格列
  • 删除现有的表格列

现在我正在对ALTERCREATEDROP进行追踪搜索。

是否有其他命令可以执行上述操作并且我应该在搜索中包含这些命令?

请注意,出于安全原因,我不需要这样做。我只需要知道表架构是否已更改,因此我可以更新架构信息的本地缓存...

3 个答案:

答案 0 :(得分:4)

对于某些DBMS(PostgreSQL,MS SQL Server,Informix)SELECT ... INTO ...可以创建一个新表。

答案 1 :(得分:4)

通过字符串检查很难做到。

还有其他方法可以进行更改:

SELECT *
INTO SomeTable
FROM SomeOtherTable

sp_rename 'OldTable' 'NewTable'

安全或DDL触发器可能是更好的选择。

答案 2 :(得分:3)

如果在字符串常量内发生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实现允许/* */作为内联comments的分隔符。

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