2

文字列にデータベースを変更する特定のSQLコマンドが含まれているかどうかを調べようとしています。

  • 新しいテーブルの作成
  • 既存のテーブルを削除する
  • 新しいテーブル列の作成
  • 既存のテーブル列を削除する

現在、私はstrpos検索を実行していますが、ALTERこれは機能するはずです。CREATEDROP

上記のことを実行し、検索に含める必要がある他のコマンドはありますか?

セキュリティ上の理由から、これは必要ないことに注意してください。テーブルスキーマが変更されたかどうかを知る必要があるので、スキーマ情報のローカルキャッシュを更新できます...

4

3 に答える 3

4

一部の DBMS (PostgreSQL、MS SQL Server、Informix) ではSELECT ... INTO ...、新しいテーブルを作成できます。

于 2011-12-07T20:10:19.123 に答える
4

これを文字列チェックで行うのは非常に困難です。

次のような変更を行う方法は他にもあります。

SELECT *
INTO SomeTable
FROM SomeOtherTable

sp_rename 'OldTable' 'NewTable'

セキュリティまたは DDL トリガーは、おそらくより適切な選択です。

于 2011-12-07T20:11:07.950 に答える
3

文字列定数内で ALTER、CREATE、または DROP が発生すると、1 つの誤検知が発生する可能性があります。

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 ...
于 2011-12-07T20:19:59.420 に答える