sql >> データベース >  >> RDS >> Sqlserver

動的クエリのパラメーターとしての SQL ストアド プロシージャ引数

    より安全な代替手段を次に示します:

    ALTER PROCEDURE dbo.queryfunctions 
      @Tabname NVARCHAR(511),
      @colname NVARCHAR(128),
      @valuesname VARCHAR(150)
    AS
    BEGIN
      SET NOCOUNT ON;
    
      DECLARE @sql NVARCHAR(MAX);
    
      SET @sql = 'SELECT * FROM ' + @Tabname 
               + ' WHERE ' + QUOTENAME(@colname) + ' = @v';
    
      EXEC sp_executesql @sql, N'@v VARCHAR(150)', @valuesname;
    END
    GO
    
    EXEC dbo.queryfunctions N'dbo.education', N'eduChildName', 'Revathi';
    

    何を変更しましたか?

    <オール>
  1. 常に dbo を使用する オブジェクトを作成/参照するときのプレフィックス
  2. テーブルと列の名前は NVARCHAR です できます 150文字以上であること。将来誰かが追加する可能性のあるテーブルに対応するパラメーターを許可する方がはるかに安全です。
  3. SET NOCOUNT ON を追加しました ネットワークのオーバーヘッドを防ぎ、誤った結果セットをクライアントに送信する可能性があります。
  4. @sql 常に NVARCHAR である必要があります .
  5. QUOTENAME を使用 SQL インジェクションを阻止し、不適切な名前 (キーワードなど) から保護するために、テーブルや列などのエンティティ名の前後に配置します。
  6. 可能な場合は適切なパラメータを使用してください (これも SQL インジェクションを阻止するのに役立ちますが、文字列パラメータであらゆる種類の区切り文字をエスケープする必要がないようにするためでもあります)。


    1. Active Record、Rails、Postgresで複数の重複フィールドを持つ行を検索する

    2. Dockerを使用してTimescaleDBをデプロイするためのガイド

    3. PythonPickledオブジェクトをMySQLデータベースに保存する

    4. データベースから読み取ったオプションメニューを選択し、その値を使用します