質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
pgAdmin

pgAdminは、オープンソースのPostgreSQL管理ツール。様々な機能を持ち、コマンドラインベースでPostgreSQLへ行う操作のほとんどをpgAdminを用いて実行することができます。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

4回答

2189閲覧

[postgeSQL・vba]リレーション"OOO"は見つかりませんと表示される

jun_endo

総合スコア56

pgAdmin

pgAdminは、オープンソースのPostgreSQL管理ツール。様々な機能を持ち、コマンドラインベースでPostgreSQLへ行う操作のほとんどをpgAdminを用いて実行することができます。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/08/16 02:04

編集2018/08/16 05:24

#今挑戦していること
vbaで、前処理して入手した情報を、postgreSQLにINSERTして、
テーブルにどんどん情報を追加していきたい。

#エラー内容

Error

1実行時エラー'-2147467259(8004005)': 2ERROR:リレーション'trm_autocad'は存在しません。 3Error while executing the query

色々と調べて、コードを変えて挑戦してみましたが、
うまく解決できなかったので、困っています。

それと、非常にお恥ずかしいのですが、
pgAdominでSQLを打ち込みたいのですが、
どこで打ち込めばいいのかわからないので、それも一緒に教えていただけると、
非常にうれしいです。

#テーブル
使用しているテーブル

#プログラム

vba

1Function func_DB() 2 Dim cn As Variant 3 4'** ODBC 接続 5 Set cn = CreateObject("ADODB.Connection") 6 cn.Open "dsn=xxx;uid=xxx;pwd=xxx" 7 cn.CursorLocation = 3 8 9'** トランザクション開始 10 cn.BeginTrans 11 12'** レコード処理 13###この下の行で実行エラーが発生する 14 cn.Execute "INSERT INTO TRN_AUTOCAD VALUES ('1-00-4467', 1026, 1043, 1, 1000, 250, 30, '要確認', '1-00-4467102610431')" 15 16'** トランザクション終了 17 cn.CommitTrans 18 19'** ODBC 接続解除 20 cn.Close 21End Function

#わかったこと
上記に記入したプログラムのINSERTの部分をクエリツールで実行してみたところ。

SQL

1before:INSERT INTO TRN_AUTOCAD VALUES ('1-00-4467', 1026, 1043, 1, 1000, 250, 30, '要確認', '1-00-4467102610431') 2 3afterINSERT INTO "TRN_AUTOCAD" VALUES ('1-00-4467', 1026, 1043, 1, 1000, 250, 30, '要確認', '1-00-4467102610431') 4

このようにして、テーブルにダブルコーテーションしなくてはいけないことが分かりました。
なので、上記をVBA側にうまく変換して挑戦してみようと思いました。

VBA

1cn.Execute "INSERT INTO 'TRN_AUTOCAD'(CONSTRUCTION_NO, PAGE_START, PAGE_END, STONE_NO, HEIGHT, WIDTH, THICKNESS, STATUS, P_ID) VALUES ('1-00-4467', 1026, 1043, 1, 1000, 250, 30, '要確認', '1-00-4467102610431')"

文字列にするために、シングルクォーテーションで括りました。
そして、いろんな方からテーブルの列の名前を追加するといいといわれたため、
それも追加しました。
結果は

Error

1構文エラー:"TRN_AOTOCAD"周辺で構文エラーです。

と表示されるようになりました。

pgAdmin側で、列の名前を追加したものを実行してみたところ、
構文エラーが出たので、列の名前を記入しない方がpgAdmin側ではうまくいきました。

ほかにもいろいろと試しました。

#接続時にdbnameの追加する

VBA

1'** ODBC 接続 2 Set cn = CreateObject("ADODB.Connection") 3 cn.Open "dsn=XXX;uid=XXX;pwd=XXX;dbname=XXX"

ダメでした。

#{接続先DB名}やpublicと付け足す

VBA

1cn.Execute "INSERT INTO public.TRN_AUTOCAD(CONSTRUCTION_NO, PAGE_START, PAGE_END, STONE_NO, HEIGHT, WIDTH, THICKNESS, STATUS, P_ID) VALUES ('1-00-4467', 1026, 1043, 1, 1000, 250, 30, '要確認', '1-00-4467102610431');" 2 3cn.Execute "INSERT INTO {接続先DB名}.TRN_AUTOCAD(CONSTRUCTION_NO, PAGE_START, PAGE_END, STONE_NO, HEIGHT, WIDTH, THICKNESS, STATUS, P_ID) VALUES ('1-00-4467', 1026, 1043, 1, 1000, 250, 30, '要確認', '1-00-4467102610431');"

ダメでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

テーブルにダブルコーテーションしなくてはいけないことが分かりました。

括るならダブルクォートですが、不要ですよ。
日本語のテーブル名や項目名であっても不要です。

SQLの構文エラーは以下のようになっていないからです。

SQL

1INSERT INTO TRN_AUTOCAD(項目名1,項目名2,・・・) VALUES (項目名1の値,項目名2の値,・・・)

接続に関してはテーブルが作成されているスキーマや権限などが合っていないのでしょう。
スパーユーザーで接続し、スキーマ名.テーブル名のようにスキーマ修飾を付けると必ず成功するはずですが、

接続ユーザーと同名のスキーマを接続ユーザーで作成し、テーブルも接続ユーザーで作成するのが一般的です。
そうすれば、スキーマ修飾は不要です。

投稿2018/08/16 04:02

編集2018/08/16 04:07
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jun_endo

2018/08/16 04:11

上記のコードをvbaでへんかんして、実行してみましたが、 やはり、同じように、存在しませんと言われました。 もちろんpublicもつけてじっこうしました。
sazi

2018/08/16 07:31

そのテーブルはpublicスキーマにありますか?
guest

0

postgreSQLか、SQL事態の仕様なのかはわかりませんが、
文字の大文字は自動で小文字に変換されるということに気が付きました。

そのため、私のDBはほとんどの項目は大文字で成り立っていたために、
色々と不具合が発生しました、
なので、今のDBの項目すべてを小文字にして、再度テーブルを作成しました。
結果はうまくいきました。

色々と親身になって教えてくださった皆様本当にありがとうございました。

投稿2018/08/16 08:06

jun_endo

総合スコア56

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/08/16 08:24

小文字扱いにするのは仕様です。 大文字として認識させたい時は"で括ります。 でも、小文字にしておいた方が断然面倒くさくないです。
guest

0

接続文字列につなぎ先dbnameなど指定されていないように見えますが、そこが原因では?
{つなぎ先DB名}.TRN_AUTOCAD とするか、接続時にDB名指定して接続してみてください。

投稿2018/08/16 02:18

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jun_endo

2018/08/16 02:24

"{つなぎ先DB名}.TRN_AUTOCADは存在しません" と表示されました。 わかったことが一つありましたので、 そちらの方を確認して、もう一度回答をいただけないでしょうか? 宜しくお願いします。
m.ts10806

2018/08/16 02:27

{つなぎ先DB名}は実際のDB名を入れたということですよね?
m.ts10806

2018/08/16 02:31 編集

ちなみにダブルクォーテーションではなく`バッククォートでなければなりません。(日本語名使うなら別ですが) 通常はバッククォートで括る必要はないですが例えばDBの予約語を使いたいときなんかに、そのままでは使えないのでバッククォートで括って使うケースがあります。 進んだように見えて構文エラーなので後退しています。
jun_endo

2018/08/16 02:29

はいそうです。 実際に使用しているDB名を入れました。
jun_endo

2018/08/16 02:31

ありがとうございます。 もういちど、考えてみます。
m.ts10806

2018/08/16 02:31

やはり接続時にDB名を入れたほうが良いかと。
jun_endo

2018/08/16 02:37

クエリツールの方でも、vbaの方でも、バッククォートで実行しましたが、 どちらも、構文エラーでした、 エラーの箇所も、どちらもバッククォートの部分で引っかかってます。 DB名えお入れて、やりましたが同じでした。 正直バッククォートは間違いなのではと考えているところです。
m.ts10806

2018/08/16 02:49

最初に「バッククォートで括る必要はない」と前置きしてますけど。 ダブルクォーテーションを使われたのでそこではないという指摘です。 あくまで接続先DBがコードで明示されていないことが問題の根底です。 (私の方では構文チェッカーでバッククォートでエラーなかったので)
jun_endo

2018/08/16 04:19

DB先を書いても、結局は、実行エラーで見つからないと 表示されます。
m.ts10806

2018/08/16 04:35

pgAdmin上で実行した場合は問題なく実行されるんですよね?
jun_endo

2018/08/16 04:46

いえ、pgAdmin上でも実行エラーが発生します。 {つなぎ先DB名}.TRN_AUTOCAD public.TRN_AUTOCAD のどちらもVBAでもpgAdminでも実行エラーが発生しました。 vbaの接続時に "dbname=XXX" と接続先を記入してもダメでした。 ちなみに、接続先DB名は servers > postgreSQL > データベース > の中の自分が接続したいDBのことですよね?
m.ts10806

2018/08/16 04:51

自分が接続したい というよりそのテーブルが存在するDBです。
jun_endo

2018/08/16 05:07

はいそうです存在しているものを接続してみましたが ダメでした。
guest

0

ベストアンサー

pgAdmin4
pgAdmin4のツールの中に、クエリツールがありますよ。
(まずはそこだけ。)

それと、テーブルが見つからない件は、
テーブルなどスキーマを作成したユーザーと
VBAからアクセスするユーザーが食い違うときに、
ユーザーの権限不足で起こりがちです。
21.3. ロールのメンバ資格
ユーザーは特定のロールに属していて、
ロールそれぞれに対してどのスキーマのどの要素にどういうアクセスを許可するかを管理しています。
pgAdmin4なら、Serversのすぐ下、ログイン/グループロールのところで状況を確認できますので、
不足の権限を与えるようにしてください。

加えて、pgAdmin4で、
データベース→スキーマ→publicなどとたどると、
そのスキーマにアクセスできるユーザーの権限が見えます。
(むしろこっちが大事でした。)
postgresユーザーなどスーパーユーザーでデータベースにログインしないと、
この設定は変更できないので注意です。

なお、アプリなどから接続するときのユーザーに、
スーパーユーザー権限はつけてはいけません。
ミスでデータベースを壊す可能性がありますので、
権限付与は最小限で。
イメージ説明

ついでに文法。

INSERT INTO PUBLIC.TRN_AUTOCAD VALUES ('1-00-4467', 1026, 1043, 1, 1000, 250, 30, '要確認', '1-00-4467102610431');

テーブルのすべてのカラムに定義順通りに値を格納するのであれば良さそうに見えるけど、
もしもカラムを省略したり順序が入れ替わっているなら

INSERT INTO PUBLIC.TRN_AUTOCAD( column_a, column_b, column_c, column_d, column_e, column_f, column_g, column_h, column_i ) VALUES ('1-00-4467', 1026, 1043, 1, 1000, 250, 30, '要確認', '1-00-4467102610431');

みたいに指定したほうが間違いないです。

pgAdmin4利用時のユーザーを切り替えるには、
イメージ説明
画像に示す箇所でサーバーから切断した後、
プロパティにて接続に使うユーザー名を設定しなおせばよいです。

投稿2018/08/16 02:12

編集2018/08/16 05:52
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jun_endo

2018/08/16 02:15

ありがとうございます! 私自身ももう少し、考えてみます。
jun_endo

2018/08/16 02:32

今使用している、ユーザー名のログインロールの権限を確認しましたが、 全て"yes"になっていました。
退会済みユーザー

退会済みユーザー

2018/08/16 02:40

「public.」を略さないとどうなりますか?
jun_endo

2018/08/16 02:45

ダメでした、 "public.trn_autocad"は見つかりません と表示されました。
退会済みユーザー

退会済みユーザー

2018/08/16 02:52

スキーマのセキュリティの話っぽいと思われるので、回答内に加筆しました。
jun_endo

2018/08/16 04:17

上記のようにたどりましたが、 セキュリティの部分にカーソルを当てても、 触れないようになっていました。 これは、つまりスーパーユーザーではないということでしょうか?
退会済みユーザー

退会済みユーザー

2018/08/16 04:24

pgAdmin4でアクセスするときのユーザーが スーパーユーザーの権限がないと変更できません。 例えばpostgresユーザーとか。 ログイン/グループロールのあたりで (設定変更に)使えるユーザー名を確認しましょう。
jun_endo

2018/08/16 04:34

申しわないですが。 確認方法はどのように確認すればいいのでしょうか?
jun_endo

2018/08/16 06:18 編集

postgresユーザーにしても触ることができないのですが、 ログイン/グループロールのところにはPGから始まる名前が四つと、 postgresの合計5つしかないので今は間違いなくpostgresユーザーだと思います。 変更というのはどうやってやるものなのですか?
jun_endo

2018/08/16 08:07

使用を拝見したら一発で謎が解明できました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問