2011-12-07 34 views
2

我試圖找出是否一個字符串包含由改變數據庫中的某些SQL命令數據庫結構:確定是否一個SQL查詢改變

  • 創建新表
  • 刪除現有的表
  • 創建新表列
  • 刪除現有表列

現在,我做了一個搜索strpos,CREATEDROP這應該工作。

是否有任何其他命令可以執行上述操作,並且我應該在搜索中包含這些命令?

請注意,出於安全原因,我不需要這個。我只需要知道,如果表架構更改,所以我可以更新我的本地架構信息的緩存...

+9

更好的方法是不允許用戶做這樣的事情,只有管理員應該創建或更改或刪除表,並且沒有用戶應該擁有權限。 – HLGEM

+0

srsly爲什麼要在上面評論?我剛剛寫道,這不是出於安全原因:) – Alex

+1

我們如何知道這不是一個管理界面?許多軟件都有一個管理界面,允許人們更改表格。通常這些是用戶定義的表格,核心應用程序表格是不允許的,但這是一個合法的設計。 – David

回答

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 ... 
4

對於某些DBMS(PostgreSQL的,MS SQL服務器,Informix的)SELECT ... INTO ...可以創建一個新表。

+0

在MYSQL中,還有'RENAME'(數據庫或表)。 –

4

這將通過字符串檢查很難做到。

還有其他的辦法,使樣改變:

SELECT * 
INTO SomeTable 
FROM SomeOtherTable 

sp_rename 'OldTable' 'NewTable'

安全或DDL觸發器可能是更好的選擇。