0

私はcsvファイルからテーブルにデータをコピーするために(webportalの1つからコピーして修正した)関数をコピーしました。Postgres SQLエラー:ファイルをコピーするにはスーパーユーザーでなければなりません

create or replace function public.load_csv_file 
(
target_table text, 
csv_path text, 
col_count integer 
) 

returns void as $$ 

declare 

iter integer; -- dummy integer to iterate columns with 
col text; -- variable to keep the column name at each iteration 
col_first text; -- first column name, e.g., top left corner on a csv file or  spreadsheet 

begin 
set schema 'public'; 

create table insert_from_csv(); 

-- add just enough number of columns 
for iter in 1..col_count 
loop 
    execute format('alter table insert_from_csv add column col_%s text;', iter); 
end loop; 

-- copy the data from csv file 
execute format('copy insert_from_csv from %L with delimiter '','' quote ''"'' csv ', csv_path); 

iter := 1; 
col_first := (select col_1 from insert_from_csv limit 1); 

-- update the column names based on the first row which has the column names 
for col in execute format('select unnest(string_to_array(trim(temp_table::text, ''()''), '','')) from temp_table where col_1 = %L', col_first) 
loop 
    execute format('alter table insert_from_csv rename column col_%s to %s', iter, col); 
    iter := iter + 1; 
end loop; 

-- delete the columns row 
execute format('delete from insert_from_csv where %s = %L', col_first, col_first); 

-- change the temp table name to the name given as parameter, if not blank 
if length(target_table) > 0 then 
    execute format('alter table insert_from_csv rename to %I', target_table); 
end if; 

end; 

$$ language plpgsql; 

そして 渡すパラメータは

選択load_csv_fileとして( '顧客'、 'C​​:\ Insert_postgres.csv'、4)

が、エラーメッセージを取得することは

ERROR:でなければなりませんスーパーユーザーがファイルとの間でCOPYする ヒント:誰でもstdoutまたはstdinにCOPYできます。 psqlの\ copyコマンドは、誰にでも動作します。

私は自動テストを作成し、別のインスタンスでテストしたい場合、テストでは自動的に関数を作成し、CSVファイルからデータをコピーする必要があります。 スーパーユーザーなしでデータをコピーする方法はありますか?

+0

実行中のユーザーにはファイルシステムに対するアクセス許可が必要です。私はこれが/ homeディレクトリにデフォルト設定されていると信じています。コピーファイルが存在するディレクトリで実行ユーザーに読み書きを許可することはできますか? – Mokadillion

+0

はい、私が使用しているユーザーにはその権利があります。 – Geeme

+0

https://stackoverflow.com/questions/20268420/postgres-copy-to-from-a-file-as-non-superuser –

答えて

0

Looks Insert_postgres.csvは、通常は読み取り/書き込みアクセス権を持たないCドライブにあります。ファイルをあなたのディレクトリに移動して、少なくともいくつかのグループまたは全員にRead/Writeを与えてください。 これで問題は解決します。

+0

ファイルをc:\ Test \ Insert_postgres.csvに移動しようとしましたが、同じエラーが表示されました。 注:使用しているpostgresユーザーはスーパーユーザーではありません。 – Geeme

+0

ユーザをスーパーユーザにするには、次のように入力します。ALTER USER username SUPERUSER; ユーザをスーパーユーザにしないようにするには、次のように入力します。ALTER USER username NOSUPERUSER; ユーザーがデータベースを作成できるようにするには:ALTER USER username CREATEDB; CREATEROLEとCREATEUSERを使用して、スーパーユーザーにすることなくユーザー権限を許可することもできます。 –

+0

https://stackoverflow.com/questions/10757431/postgres-upgrade-a-user-to-be-a-superuser –

関連する問題