見守り電球またはGPS端末が特価中!

ローカルホストから、他のマスタDBにDBリンクを作成しました。
しかし、DBリンクは作成できなのにいざ参照しに行くと下記のエラーが出ます。

select * from Tablename@Linkname

ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。

どうしてでしょうか、他のサイトにはこれで参照できるといっていたのですが...

また、違う質問になりますがこれで参照しにいけるなら
なんでSnapshotやマテリアライズドビューなどが存在しているのでしょうか?

初歩的な質問ですみませんがどなたか教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

oracleのデータベースリンクは「create database link」時点ではユーザー、パスワードの妥当性をチェックしません。


ローカルホストからSQL*PLUSでデータベースリンク作成時のSQL文で使ったユーザ名、パスワード、接続文字列でつながるか確認してみてください。
11gから認証の際の大文字小文字を区別するようになっているみたいですから注意してください。

> なんでSnapshotやマテリアライズドビューなどが存在しているのでしょうか?
Snapshotやマテリアライズドビューはローカルホストにデータがありますから、SQL発行のたびにネットワーク経由でのアクセスが発生しません。
当然、パフォーマンスも向上します。
    • good
    • 0
この回答へのお礼

マテリアライズドビューの存在意義がわかり、
助かりました。
ありがとうございます。

お礼日時:2011/01/24 14:46

DBリンクを作成できることと、実際に接続できるかは別問題です。


DBリンクは権限を持っていて、create文の構文が間違っていなければ作成できるはずです。
マスタDBにはcreate文に記述したユーザー名/パスワードは実際に存在するのでしょうか?
また、tnsnames.oraの設定は正しいですか?
まずは、sqlplusなどでマスタDBにちゃんとログインできる情報なのかを確認してみてください。

Snapshotとマテリアライズドビューは同様の機能です。
以前はSnapshotと呼ばれていて、下位互換性のために現在もキーワードとして残っているようです。
別に他DBを参照するためだけならDBリンクでいいかもしれませんが、
バックアップのためであったり、ネットワーク越しでは十分なパフォーマンスが出なかったり・・
その他にもマスタDBとは別に実体として保持しておく必要がある場面が多々あると思います。
そういう時にはマテリアライズドビューを使えばいいのではないでしょうか。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
参考にさせていただきます。

お礼日時:2011/01/24 14:45

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QDATABSE LINKについて

現在Oracle10gとOracle11gのDataBaseLinkを行っているのですが、
DBLinkを作成し、データを取得しようとしたら、
「ORA-01017: invalid username/password; logon denied
ORA-02063: 先行のエラー・メッセージを参照してくださいline(XXX.XXXX.CO.JP)。」の様なエラーがおきます。

以下に実行したSQLを書いています。
create database link ****.****.co.jp
connect to user identified by ****
using '****'

↑に書いたユーザとパスワードで、
「Connect ユーザ/パスワード@Link先DB」をすれば繋がるのは確認出来ています。

色々ネットで調べてみたものの、原因が掴めていません。
何の要因から起こるエラーなのか、分かりません。
何かご存知の方がいらしたら、教えて頂けますか?
宜しくお願いします。

Aベストアンサー

可能性の1つとして考えてください。
データベースリンクを作成した際、
ユーザーとパスワードを逆に設定してしまった。
なんて事はないでしょうか?

普通にCONNECTできているという事は、
権限関係は恐らく問題ないと思われるので。

QDBリンク経由の参照について

サーバ【A】のスキーマ【あ】にDB【テーブル1】があります。
サーバ【A】のスキーマ【い】に、【あ】からセレクト権限を与えた所、【い】から【テーブル1】を参照できるようになりました。

次に、
サーバ【B】からサーバ【A】にDBLINKをはりました。
(tnspingで接続されているのを確認済)。
これで、
サーバ【B】のスキーマ【あ】からDBLINK経由で【テーブル1】を参照できるようになりました。

しかし、サーバ【B】のスキーマ【い】から【テーブル1】が参照できません。

私としては、スキーマ同士の権限を与え、DBLINKが正しく繋がっているので、参照できるのでは??と思うのですが、
何度やっても、
---------------------------------------------------------------
ORA-04043: オブジェクト"【あ】"."【テーブル1】"は存在しません。
---------------------------------------------------------------
が表示されてしまいます。

原因として何が考えられるでしょうか…??
説明不足だったらすみません。
何か考えられる可能性があったら教えて下さい。

サーバ【A】のスキーマ【あ】にDB【テーブル1】があります。
サーバ【A】のスキーマ【い】に、【あ】からセレクト権限を与えた所、【い】から【テーブル1】を参照できるようになりました。

次に、
サーバ【B】からサーバ【A】にDBLINKをはりました。
(tnspingで接続されているのを確認済)。
これで、
サーバ【B】のスキーマ【あ】からDBLINK経由で【テーブル1】を参照できるようになりました。

しかし、サーバ【B】のスキーマ【い】から【テーブル1】が参照できません。

私としては、ス...続きを読む

Aベストアンサー

データベースリンクの定義が適切ではないのだと思います。

サーバBからサーバAへのデータベースリンクでの権限は、
データベースリンク定義に書かれているユーザで決まります。

どのような定義にしたんですか?

Qbatファイルからsql文実行

クライアントOS:WIN2000
Oracle:9i(サーバ(UNIX)上にあります)

現在、クライアントからbatを起動し、SQL文を投げ、結果を取得したいと思っております。
(SQL文は単純にTBLをカウントしているだけです)

・batの中身
sqlplus %UID%/%PASS%@%SID% @test.sql > output

結果は取得出来るのですが、余分な情報も結果に出力されてしまいます。結果のみを出力させるにはどうすればよろしいでしょうか?

・余分な情報
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
に接続されました。

Aベストアンサー

sqlplus に -S オプションを追加してみればどうでしょうか。

参考URL:http://biz.rivus.jp/sqlplus_overview.html

QSIDとSERVICE_NAMEの違いとは?

tnsnames.oraの中の(CONNECT_DATA=に SIDだったりSERVICE_NAMEだったりしますが、どのような違いがあるのでしょうか?
どちらでもつながるのでいいかとは思いますが、何かメリット・デメリットでもあるのでしょうか?
それとも過去の遺物が未だ共存しているだけでしょうか?
SIDはインスタンスにつけられた名前だと知っていますが、SERVICE_NAMEってなんですか?

Aベストアンサー

SIDはインスタンスの識別子、service_nameはサービス名。
インスタンスとサービスの違いはRAC を勉強されるとよくわかると思います。

サービス名は初期化パラメータのservice_namesで設定します。
設定されていない場合は先述のとおりdb_unuque_name.db_domainになります。
(これが同義と誤解されやすい原因となっているわけですが)

ところで、service_namesパラメータですが、複数形になっていることからもわかるように、複数のサービス名をコンマ区切りで指定できるようになっています。

これをこのように使います。

2ノードRAC環境で、インスタンス1(SID=hoge1)、インスタンス2(SID=hoge2)があったとします。
ノードを意識することなく接続できるようにするためにクライアント側のtnsnames.oraにはこんな設定を追加します。

HOGE.EXAMPLE.COM
(DESCRIPTION =
(LOAD_BALANCE = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = host1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = host2)(PORT = 1521))
(CONNECT_DATA = (SERVER = DECIDATED)(SERVICE_NAME = hoge.example.com))
)

インスタンス1とインスタンス2のservice_namesパラメータにhoge.example.comを追加します。すると、インスタンス1とインスタンス2にラウンドロビンで接続できるようになります。

ここで、もしtnsnames.oraのservice_name=...がSID=hoge1だったらどうなるでしょう?
インスタンス2のSIDはhoge2ですから一致せず、インスタンス2には接続できず、いつもインスタンス1に繋がってしまいます。

次に、一時的にメンテナンスのためにインスタンス2にアクセスしてほしくないケースを考えます。service_nameであれば、インスタンス2のservice_namesパラメータからhoge.example.comを削除することで(動的に変更できます)直ちにインスタンス1にのみ接続されるようにできます。

ここで、もしORACLE_SIDだったら・・・変更のためにインスタンスの再起動が必要になってしまいますね?

最後にservice_namesは複数登録できます。3ノードRAC環境において、オンライン処理(service_name=ONLINE)、バッチ処理(service_name=BATCH)があったとします。
バッチ処理は1つのノード(インスタンス1)でのみ処理したいとします。オンライン処理は3つのノードでしたいとします。

そんなとき、service_nameであれば、

<<サーバ側の初期化パラメータ>>
1:service_names = online, batch
2:service_names = online
3.service_names = online

<<クライアント側のtnsnames.ora>>

オンライン処理
ONLINE.EXAMPLE.COM
(DESCRIPTION =
(LOAD_BALANCE = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = host1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = host2)(PORT = 1521))
(CONNECT_DATA = (SERVER = DECIDATED)(SERVICE_NAME = online.example.com))
)

BATCH.EXAMPLE.COM
(DESCRIPTION =
(LOAD_BALANCE = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = host1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = host2)(PORT = 1521))
(CONNECT_DATA = (SERVER = DECIDATED)(SERVICE_NAME = batch.example.com))
)

と、クライアント側では接続先サーバを気にすることなく構成できますね?
BATCHのノードを1から2にしたい場合の変更はサーバ側のみでできますよね?
serivce_namesの"batch"設定をノード2に移すだけです。

SIDはインスタンスの識別子、service_nameはサービス名。
インスタンスとサービスの違いはRAC を勉強されるとよくわかると思います。

サービス名は初期化パラメータのservice_namesで設定します。
設定されていない場合は先述のとおりdb_unuque_name.db_domainになります。
(これが同義と誤解されやすい原因となっているわけですが)

ところで、service_namesパラメータですが、複数形になっていることからもわかるように、複数のサービス名をコンマ区切りで指定できるようになっています。

これをこのように...続きを読む

QOracle(オラクル)で、日付時刻型の検索方法について

質問させていただきます。
データベースはオラクルを使っていて、
SQL文で、抽出するときにエラーが出て困っています。

日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。
2005/05/26 を抽出したいのですが、
BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59'

だと、エラーでできません。
どなた様か、ご教授よろしくお願いしますm(_ _)m

Aベストアンサー

日付検索を行う場合は、以下のように書式を含める必要があります。

col BETWEEN TO_DATE('2005/05/26 00:00:00','YYYY/MM/DD HH24:MI:SS') AND TO_DATE('2005/05/26 23:59:59','YYYY/MM/DD HH24:MI:SS')

ただ、厳密には

col >= TO_DATE('2005/05/26', 'YYYY/MM/DD')
AND
col < TO_DATE('2005/05/27', 'YYYY/MM/DD')

と書くべきでしょうね。

Qoracleで別のグローバルデータベースのテーブルからPL/SQLでデータをinsertする方法。

こんにちは。

別の場所に設置してあるoracleのデータベースからinsert文でデータを引っ張って来れないかと思っています。

ご存知の方いらっしゃれば宜しくお願い致します。

内容:
ここのoracleです。
グローバルデータベース名:testa.ok.com
(データベース名:testa)
スキーマ名:output
テーブル名:名称マスタ
項目内容:番号、名前
ユーザ名:tosi
password:tosi

あっちのoracleです。
グローバルデータベース名:testb.ok.com
(データベース名:testb)
スキーマ名:input
テーブル名:名称マスタ
項目内容:番号、名前
ユーザ名:tosi
password:tosi

PL/SQLで出来ないものでしょうか?
宜しくお願い致します。

Aベストアンサー

こんにちわ。

データベースリンクを使用すれば可能です。
まず、あっちのデータベース (testb.ok.com) に接続
するための接続文字列をtnsnames.ora に定義します。
→ sqlplus tosi/tosi@接続文字列 でtestb.ok.com
  に接続できる事を確認して下さい。

次にtesta.ok.com 側にデータベースリンクを作成します。
Create database link DBリンク名
 connect tosi identified by tosi using '接続文字列';
→ select ~ from input.名称マスタ@DBリンク名
  where ~
 で、データベースリンク経由でデータにアクセスできること
 を確認して下さい。

後は、SQL 文 (PL/SQL でも可) の中で
Insert into 名称マスタ select * from
 input.名称マスタ@DBリンク名 where ~;
とすれば、Ok です。

QOracle12cでユーザのSQLPLUSログイン

基本的な質問ですみません。Oracle 12cを初めて使うのですが、すごく単純に、ユーザを作成し、そのユーザでデータベースオブジェクト(テーブルなど)を作成する拡張子が.sqlのスクリプトを流したいです。

11gまでの場合、システムユーザでCREATE USERしたのちに、コマンドプロンプトを立ち上げて
C:\Scripts> SQLPLUS <USER>/<PASSWORD> @createtables.sql
とするだけで良かったと思います。

今回、12cではユーザの考え方が変わっており、CDBとPDBを作成しました。
> SQLPLUS /NOLOG
SQL> CONN SYS AS SYSDBA
(上記のようにローカル接続するとCDBに接続される)

SQL> ALTER SESSION SET CONTAINER=PDB1; // PDBへ移動
SQL> SHOW CON_NAME // 念のため現在接続中のPDBの名前確認
SQL> STARTUP;
(これでマウント状態だったPDB1がOPENしてREAD WRITEになる)

この状態でCREATE USER文を実行してPDB1上でユーザを作成。

ここからなんですが、PDBやCDBへのログイン方法はわかたのですが、PDB上で作成したユーザにはどのようにしてログインするのでしょうか? ログインしてテーブル作成をしたいです。また、テーブル作成のスクリプト文(.sql)があるのでそれを流したい場合は、コマンドプロンプトからどのように実行すればよいでしょうか?

基本的な質問で恐縮ですが、宜しくお願いします。

基本的な質問ですみません。Oracle 12cを初めて使うのですが、すごく単純に、ユーザを作成し、そのユーザでデータベースオブジェクト(テーブルなど)を作成する拡張子が.sqlのスクリプトを流したいです。

11gまでの場合、システムユーザでCREATE USERしたのちに、コマンドプロンプトを立ち上げて
C:\Scripts> SQLPLUS <USER>/<PASSWORD> @createtables.sql
とするだけで良かったと思います。

今回、12cではユーザの考え方が変わっており、CDBとPDBを作成しました。
> SQLPLUS /NOLOG
SQL> CONN SYS AS SYSDBA
...続きを読む

Aベストアンサー

こんにちわ。

> ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。
上のtnsnames.ora の設定は、CDB に接続するためのものです。
新しい接続文字列で、SERVICE_NAME にPDB名を指定したものを作成して
試してみて下さい。

Qsqlplusで表示が変なので、出力を整形したい。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------

上記のように意味不明な形式で出てきます。

例えばこんな風に

select カラム1,カラム2,カラム3 from hoge;

カラム1 1の値
---------------------------
カラム2 2の値
---------------------------
カラム3 3の値

等のように分かりやすく表示できないでしょうか?

ちなみにOracle9iR2を使用しています。
sqlに関するツールは使用できないルールでして、あくまでsqlplusのコマンド上でみやすくしなければなりません。

分かりづらくですいませんが、皆さま、ご教授お願いします。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
-----------------------...続きを読む

Aベストアンサー

SQLPLUSを起動して、

SQL>set linesize 列数

でどうだ。

SQL>show linesize

で確認ができる。

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Q異なるOracleサーバ上のテーブルを結合する方法

異なるOracleサーバ上のテーブルを結合する方法

IPアドレスが異なるOracleのテーブルを結合して出力したいのですが可能でしょうか?2つのテーブルをローカルにダウンロードして結合表示するとパフォーマンスが悪いので、2つのサーバから直接データをダウンロードしたいのです。2つのOracleサーバは読み取り権限しか与えられておらず、SELECT文ぐらいしか使えません。

Oracle 10G
Windows 2003 Server

Aベストアンサー

DATABASE LINK を使用してください。

■作成方法
1.CREATE DATABASE LINK文

  CREATE [PUBLIC] DATABASE LINK dblink
   [CONNECT TO user IDENTIFIED BY password]
   [USING connect_string];

dblink
データベース・リンク名を指定します。
ドメインを省略した場合は、データベース・リンクを作成したインスタンスのデータベース・ドメインが付加されます。

PUBLIC句
 この句を指定するとパブリック・データベース・リンクが作成できます。

CONNECT TO句
接続ユーザを指定する事ができます。CONNECT TO句を指定しないとデータベース・リンクにアクセスした現行セッションのユーザでリンク先へ接続します。
ユーザ名はuserで指定し、パスワードはIDENTIFIED BY句の後のpasswordで指定します。

USING句
リンク先に接続する時の接続文字列を指定します。指定できるのはtnsnames.oraで定義されているネット・サービス名、または簡易接続ネーミングです。

例1
現行セッションのユーザでリンク先に接続するデータベース・リンクの例です。

  CREATE DATABASE LINK remote
   USING remote

例2
固定のユーザでリンク先に接続するデータベース・リンクの例です。
この例だと現行セッションのユーザに関わらず、常にtest/testでリンク先に接続します。

  CREATE DATABASE LINK remote
   CONNECT TO test IDENTIFIED BY test
   USING remote;

■アクセス方法
データベース・リンクを使用してリンク先にアクセスするには@dblinkをオブジェクト名の後に記述します。


remoteインスタンス上のtable1という表にアクセスします。

  select * from table1@remote;

参考URL:http://blogs.yahoo.co.jp/mr_makochi/9103121.html

DATABASE LINK を使用してください。

■作成方法
1.CREATE DATABASE LINK文

  CREATE [PUBLIC] DATABASE LINK dblink
   [CONNECT TO user IDENTIFIED BY password]
   [USING connect_string];

dblink
データベース・リンク名を指定します。
ドメインを省略した場合は、データベース・リンクを作成したインスタンスのデータベース・ドメインが付加されます。

PUBLIC句
 この句を指定するとパブリック・データベース・リンクが作成できます。

CONNECT TO句
接続ユーザを指定する事ができます。CON...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング