あなたの映画力を試せる!POPLETA映画検定(無料) >>

初心者です。失礼のないように努力いたしますのでご協力お願いいたします。

ログオントリガーを使用して接続者の制限をしたいのですが正常に動作しません。

CREATE OR REPLACE TRIGGER LOGON_TRG AFTER LOGON ON DATABASE
DECLARE
STR_SCHEMANAMEVARCHAR2(20);
STR_OSUSERVARCHAR2(20);
STR_PROGRAMVARCHAR2(20);
BEGIN
SELECT USERNAME,OSUSER,PROGRAM INTO STR_SCHEMANAME,STR_OSUSER,STR_PROGRAM FROM V$SESSION WHERE audsid = USERENV('SESSIONID');
IF STR_SCHEMANAME = 'SCH1' AND STR_OSUSER = 'USER1' THEN
INSERTINTOALOG (SCHEMANAME,OSUSER,LOGIN_DAT,PROGRAM)VALUES(STR_SCHEMANAME,STR_OSUSER,TO_DATE(TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS'),'YYYY/MM/DD HH24:MI:SS'),STR_PROGRAM);
COMMIT;
RAISE_APPLICATION_ERROR(-20000, 'Can not login');
END IF;
END LOGON_TRG;

<説明>
スキーマ='SCH1'にOSユーザー=’USER1’が接続してきたらALOGに情報を記録して接続しない。
このトリガーはSYSで登録しています。

<結果>
スキーマ='SCH1'にOSユーザー=’USER1’で接続するとALOGに記録はするのですが、
エラーメッセージが表示されず正常に接続できてしまいます。

<質問>
○RAISE_APPLICATION_ERRORがなぜ正常に動作しないのかがわかりません。
○RAISE_APPLICATION_ERRORに権限的なものが必要なのでしょうか?
(いろいろと調べてみましたが特に権限での制限は見当たりませんでした)

何か要因に思い当たる方がいらっしゃいましたらご協力いただければと思います。
よろしくお願いいたします。

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

A 回答 (2件)

このリンク先の解説ですが、エラーを発生させて処理を中断させることが目的で、故にログオンも中断されるという理屈だけですねー。


これまずいし、ログオンとトリガーは別プロセスなので確実にログオンがキャンセルされるとは思いにくいのですが?すべてのバージョンで稼働確認しての説明なんでしょうか?
いま環境がないので試せませんが、エラー処理には例外処理をつけるのがマナーなので、例外処理の中で例外を実行させてきちんと処理を終わらせるのが正しいはずです。リンク先のは中断を目的にしてますからね。
http://www.shift-the-oracle.com/plsql/exception/ …
ここで例外を学んで、例外処理として、ログの作成、ログインの切断を入れてみてください。
まあ試しに例外を起こす前に切断させても実験にはなりますが?
    • good
    • 0

記録はしているがセッションを切る処理が見つからないですが??


ログイン後のトリガーですからログインはされた後と言う意味です。ですから一度つながったセッションを切ってやる方法しかないと思いますよ。

execute immediate 'dbms_service.disconnect_session(''USER1'')';

この回答への補足

早速のご回答ありがとうございます。

↓このように記載されているため
http://www.istudy.ne.jp/training/serial/plsql/07 …

RAISE_APPLICATION_ERROR はユーザーにエラーを通知し処理終了(セッションは切れる)と
思っていたのですが、セッションを切るアクションが必要でしょうか?
ちなみに、RAISE_APPLICATION_ERROR の後に処理を加えても以降の処理はされません。
教えていただいた セッションを切るアクションはRAISE_APPLICATION_ERRORの前にしなくて
はいけないということでしょうか?

補足日時:2014/08/12 13:09
    • good
    • 0

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

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

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

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

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

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

で確認ができる。

Qデータを削除しても表領域の使用率が減りません

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

今使用している表領域の使用率が高くなってきたため、
不要なテーブルやデータを削除しました。

ですが、少ししか使用率が減らず困っています。

テーブルを削除した際にはPURGE RECYCLEBINで、BIN~のテーブルも
消しています。

何か他に原因があるのでしょうか?

Aベストアンサー

前の方のおっしゃるとおり、DELETEしただけでは領域は開放されません(ハイウォーターマークが下がらない)ので、以下を試してみてください。

1.該当テーブルの全件削除で良い場合
truncate テーブル名 drop storage;
を実行する。
これで領域も開放されます。(最後のところをreuse storageとすると領域保持する意味となる)

2.部分的にdeleteして、領域を開放したい場合
alter table テーブル名 enable row movement;
alter table テーブル名 shrink space cascade;
alter table テーブル名 disable row movement;
を実行する。
1行目は領域開放の前準備、3行目は1行目の変更を元に戻す意味。
2行目でcascadeしておくと、関連インデックスの領域も一緒に縮小してくれます。

Q異なる文字コードの環境にインポートするには

下記のようにサーバがあります。
・Aサーバ(Solaris)
・Bサーバ(Windows)

下記のように文字コードが異なります。
・Aサーバ(JA16EUCTILDE)
・Bサーバ(JA16SJIS)
※Oracleのバージョンは同じです。

AサーバでエクスポートしたdmpファイルをBサーバにインポートしたいと考えています。
文字コードが異なるdmpファイルをインポートするにはどのようにしたらいいのでしょうか。また注意点などあるのでしょうか。

テストする環境が今ないため、試す事ができません。
些細な事でも何でも構いませんのでアドバイスいただけませんでしょうか。
宜しくお願いします。

Aベストアンサー

ゴールとなるBサーバが、JA16SJISであるなら、何をしようが、
JA16SJISで表現できる文字コード以外文字化けする。

NLS_LANGをJA16SJISに設定したクライアントで、
(1)Aサーバからエクスポート
(2)Bサーバへインポート
するのと一緒。

今回の場合、それで問題が出るなら、DB作成時のキャラクタセットの選択ミスであり
エクスポート/インポートで何とかできる問題ではない。

最初にも書いていますが、必ず文字化けが起こるわけではないので、注意してください。
クライアントPCのOSやミドルウエアに何を使うかで、JA16SJISでも問題なく使えますので。

QOracleのテーブルサイズ

Oracle(8.0.5以降)で、テーブル毎のサイズを知りたいのですが、どこにその情報はあるのでしょうか?
テーブルが拡張されてそれぞれどの程度のサイズになっているのか、また、何%程度使用しているのか等が知りたいのです。
以前に、Oracleのシステムテーブルにそのような情報をもっていると聞いたことがあるのですが、わかりません。
どなたかわかる方がいましたら、よろしくお願い致します。

Aベストアンサー

簡単に調べる方法があります。
以下のSQL文をSQL*Plus等で実行してみてください。

select segment_name,trunc(bytes/1024,0) kb
from user_segment
where segment_name='*****'
/

*****に目的のテーブル名を設定します。
テーブルのサイズがKバイト単位で表示されます。
バイト単位で知りたい場合は、trunc(bytes/1024,0)をbytesに
置き換えます。

QOracleでオブジェクト権限を調べるディクショナリは?

Oracleであるユーザーtest_usr1がSample_tblというテーブルについて、test_user2に対してたとえばselectとupdateする権限を付与した場合、test_user2のオブジェクト権限を調べる場合、どのディクショナリで調べたらいいのでしょうか。
基本的な質問で恐縮ですが、よろしくお願いいたします。
Oracle 8.1.7のリファレンス・マニュアルを調べましたが、ここには載っていないようです。

Aベストアンサー

USER_TAB_PRIVS :
ログインユーザの所有するオブジェクトに与えれているオブジェクト権限の確認
ログインユーザが、付与したオブジェクト権限の確認
ログインユーザが、付与されたオブジェクト権限の確認

SELECT * FROM USER_TAB_PRIVS;

[カラムについて]
GRANTEE:権限を付与された側
OWNER:オブジェクトの所有者
TABLE_NAME:オブジェクト名
GRANTOR:権限を付与した人
PRIVILEGE:オブジェクト権限
GRANTABLE:WITH GRANT OPTION付かどうか

USER_TAB_PRIVS_MADE :
ログインユーザが所有するオブジェクトに関するアクセス権限の確認

USER_TAB_PRIVS_RECD :
ログインユーザに付与されているオブジェクト権限の確認

※USER_SYS_PRIVS:システム権限

この辺りを調べてみてくださいませ _(._.)_

Q特定のユーザーをログオン不可とするには?

Windows2000 Professionalで、特定のユーザーを
ネットワーク経由のアクセス(共有フォルダ)のみとし、
ローカルからのログオンを不可としたいのですが、
可能でしょうか?

Aベストアンサー

ローカル セキュリティ ポリシー
若しくは
(ActiveDirectoryの)グループポリシー
で設定します。

ローカルセキュリティポリシーの場合:
【セキュリティの設定】→【ローカルポリシー】→【ユーザ権利の割り当て】→【ローカルログオンを拒否する】

グループポリシーの場合:
【コンピュータの構成】→【Windowsの設定】→【セキュリティの設定】】→【ローカルポリシー】→【ユーザ権利の割り当て】→【ローカルログオンを拒否する】

QCLOB型へのINSERT

いつも参考にさせて頂いています。

まず、問題はCLOB型に4000Byte以上のデータを
格納出来なくて困っております。

環境は下記のとおりです。
OS:Windows2003
Oracleバージョン:9.0.1.4.0

テストした手順は
(1)テーブル作成
create table TEST_TBL (
id number(9),
data clob
);

(2)INSERT
insert into TEST_TBL values(1,'4000Byte以上のデータ');

ORA-01704: 文字列リテラルが長すぎます


CLOBは4Gまで入るはずなのになぜなんでしょうか?
ご回答よろしくお願いいたします。

Aベストアンサー

リテラルを分割する方法や PL/SQL を使用する方法もあります。

参考 URL にサンプルがあります。

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

Qsqlplusの操作をシェル上で

RedhatLinuxのシェルスクリプト上で
Oracleのsqlplus操作を行うことは可能でしょうか?
その場合、どのように記述すればよいでしょう?

やりたい内容の例としては以下になります。

#!/bin/sh
su -<oracleユーザー>
sqlplus ※※※※
SQL> update ※※※ set ※※※
SQL> exit

上のような内容をcronに登録して自動処理をかけたいと考えています。

Aベストアンサー

シェルスクリプトファイル以外のファイルを作成したくない場合はyjousさんのようにヒアドキュメントを使用するのがいいと思います。
もし、sqlを記述したファイルを置いてもかまわないのであれば
sqlplus ユーザ/パスワード @sqlファイル名
をシェルスクリプト内で書けばいいと思います。
(ファイル名はフルパスで。ファイルの最後にexitを忘れずに。)

シェルスクリプト内でsuでoracleユーザにしていますが、それならcronの登録で

0 * * * * su - oracle -c "シェルスクリプトファイル"
のようにoracleユーザにして実行してみたらどうでしょうか?(oracleはoracleユーザーとしてみてください)

QOracleでインスタンスを複数にしたい

初めて質問させていただきます。
Oracleの初心者です。
仕事でOracleインスタンスを複数にして欲しいと言われ方法を
検索したのですが、なかなか見つかりません。。
どうしたら、インスタンスを複数にできますか?
初歩的(?)なことで恥ずかしいのですが分からなくて困っています。
回答よろしくお願い致します。

Aベストアンサー

old インスタンスから new インスタンスを作成する場合以下のような流れでできるかと思います。

1.old インスタンスを起動して CREATE CONTROLFILE 文のトレースを出力。
alter database backup controlfile to trace;
2.old インスタンスを停止。
3.old インスタンスのファイルを new インスタンスを作成する場所にコピー。
4.old インスタンスの初期化パラメータファイルをコピーして new インスタンス用の初期化パラメータファイルを作成。
5.new インスタンス用のパスワードファイルを作成。
6.new インスタンス用のログ出力ディレクトリ (bdump とか) を作成。
7.ORACLE_SID を "new" にセットしてデータベースを nomount で起動。
8.1 で出力されたトレースの "old" を "new" に書き換えて実行。
9.データベースを resetlogs オプション付きでオープン。

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。


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

人気Q&Aランキング