2017-12-22 9 views
0

.NET Core 2とPostgreSQLデータベースを使用してWebアプリケーションを開発しようとしており、膨大な量のデータを記録できる必要があります。以前は、データベースでDDL操作を実行するために動的に生成されたステートメントを使用していました。太字で動的要素を持つ例:ユーザ権限を制限しながらDDL文を動的に実行する方法

言語plpgsqlが$$ ユニーク[NOTアイテムを存在する場合、テーブルをCREATE NULL IS(to_regclass( 'public.item [固有の番号]を')SELECT)IFをBEGINをDO等数](署名文字変化(50)、変化itemNameに文字(50)...

各テーブルには、特定のパラメータを持つ約50の列を含んでいる。各項目のテーブルは、それらと、アイテム・タイプの複数の動的な列が含まれてい独自の列値。

問題は、このようなダイナミックな文の生成がセキュリティ上の欠陥を突きつけているように感じることです。たぶん私は間違っていますが、それはそういう感じです。

1)各テーブルの前の列を表す50個のテーブルを作成し、すべての50を越えINSERT、およびSELECT文の中にすべてのために登録しよう:

私は2つの選択肢が出ています。 (私の関心事は、これがパフォーマンスにどのように影響するかということです。これらのテーブルの1つが壊れていれば、多くのアイテムに影響しますが、古いテーブルでは1つのアイテムにしか影響しません)

2)膨大な数の空のテーブルを事前に生成し、必要に応じて空のテーブルにINSERTレコードを入れて、別のテーブルのテーブル名を追跡します。ストアドプロシージャは、必要に応じて定期的により多くの情報を生成する可能性があります。 (これは私にとってハックのような感じです)

クライアントから送信された動的DDLステートメントを避けながら、このデータを保存する方法はありますか?

答えて

0

代わりにplpgsqlを保存して、argumetsを受け入れることができます。今

t=# create or replace function ct(_n text) returns void as $$ 
begin 
select attname into _n from pg_attribute where attname = _n; 
if _n is not null then 
    execute format('create table if not exists %I()','item'||_n); 
end if; 
end; 
$$ language plpgsql; 
CREATE FUNCTION 

t=# select ct(e'\';--hack'); 
ct 
---- 

(1 row) 

Time: 2.202 ms 
t=# \dt item* 
No matching relations found. 

を、列が有効である場合:また、あなたが注入を避けるためにformatを使用することができ、最後にそのような列が存在する場合には、例えば、チェックすることができ

t=# select ct('a'); 
ct 
---- 

(1 row) 

t=# \dt item* 
     List of relations 
Schema | Name | Type | Owner 
--------+-------+-------+------- 
public | itema | table | vao 
(1 row) 
関連する問題