我試圖找出是否一個字符串包含由改變數據庫中的某些SQL命令數據庫結構:確定是否一個SQL查詢改變
- 創建新表
- 刪除現有的表
- 創建新表列
- 刪除現有表列
現在,我做了一個搜索strpos,CREATE
和DROP
這應該工作。
是否有任何其他命令可以執行上述操作,並且我應該在搜索中包含這些命令?
請注意,出於安全原因,我不需要這個。我只需要知道,如果表架構更改,所以我可以更新我的本地架構信息的緩存...
我試圖找出是否一個字符串包含由改變數據庫中的某些SQL命令數據庫結構:確定是否一個SQL查詢改變
現在,我做了一個搜索strpos,CREATE
和DROP
這應該工作。
是否有任何其他命令可以執行上述操作,並且我應該在搜索中包含這些命令?
請注意,出於安全原因,我不需要這個。我只需要知道,如果表架構更改,所以我可以更新我的本地架構信息的緩存...
如果在字符串常量內發生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 ...
對於某些DBMS(PostgreSQL的,MS SQL服務器,Informix的)SELECT ... INTO ...
可以創建一個新表。
在MYSQL中,還有'RENAME'(數據庫或表)。 –
這將通過字符串檢查很難做到。
還有其他的辦法,使樣改變:
SELECT *
INTO SomeTable
FROM SomeOtherTable
sp_rename 'OldTable' 'NewTable'
安全或DDL觸發器可能是更好的選擇。
更好的方法是不允許用戶做這樣的事情,只有管理員應該創建或更改或刪除表,並且沒有用戶應該擁有權限。 – HLGEM
srsly爲什麼要在上面評論?我剛剛寫道,這不是出於安全原因:) – Alex
我們如何知道這不是一個管理界面?許多軟件都有一個管理界面,允許人們更改表格。通常這些是用戶定義的表格,核心應用程序表格是不允許的,但這是一個合法的設計。 – David