2011-12-07 4 views
2

を変えるかどうかを確認します。SQLクエリは、私は文字列は、データベースを変更し、特定のSQLコマンドが含まれているかどうかを確認しようとしているデータベース構造

既存のテーブル
  • を削除する新しいテーブル
  • を作成
    • を今、私はためstrpos検索をやっている既存の表の列

    を削除する新しいテーブル列

  • を作成します,CREATEおよびDROPが必要です。

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

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

  • +9

    が良いappraochは、そのようなことを行うためのユーザーのためpersmiisionsを許可しないことです、唯一の管理これまでのテーブルを作成したり、変更したりdeltingしなければならないといないユーザーが権限を持ってshoudl。 – HLGEM

    +0

    srslyなぜ上記のコメントはあなたの上に+1ですか?私はちょうどこれはセキュリティ上の理由からではないと書いています:) – 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 Server、Informix)では、SELECT ... INTO ...は新しいテーブルを作成できます。

    +0

    MYSQLには、 'RENAME'(データベースまたはテーブル)もあります。 –

    4

    これは文字列チェックを行うのがかなり難しいでしょう。おそらく

    SELECT * 
    INTO SomeTable 
    FROM SomeOtherTable 
    

    sp_rename 'OldTable' 'NewTable'

    SecurityまたはDDLトリガより良い選択です:

    があるような変更を加えるために他の方法です。

    関連する問題