tshizuku03の日記

主にoracleやLinuxコマンドについての記事を載せていきたいと思っています。

PL/SQL行トリガー例文

この記事はQiitaにも記載しております PL/SQL行トリガー例文 - Qiita

PL/SQL基礎中の基礎をメモとして残します。

<<行トリガーの作成>>
SQL> CREATE OR REPLACE TRIGGER 注文_在庫_TRIG
  2  AFTER INSERT ON 注文 FOR EACH ROW
  3  BEGIN
  4     UPDATE 在庫
  5     SET    在庫数 = 在庫数 - :NEW.注文数
  6     WHERE  製品名 = :NEW.製品名;
  7  END;
  8 /

行トリガー例。

・2行目のタイミングには「BEFORE」もしくは「AFTER」を指定。
 BEFOREであればDML処理の前に起動し、AFTERであればDML処理の後に起動。

・3行目のイベントには、トリガーの起動するDML文の種類、 すなわち「INSERT」「UPDATE」「DELETE」

・4行目には、このトリガーを設定する表の名前を指定

・「ON 表名」の後ろに「FOR EACH ROW」というキーワードがあれば行トリガーであり、なければ、文トリガー。

・OLDとNEW

:OLD.列名 ←DML操作前の列値
:NEW.列名 ←DML操作後の列値

 

参考サイト

連載 PL/SQLを使ってみよう!第38回「文トリガー、行トリガーの構文」 | 集合研修 システム・テクノロジー・アイ銀座会場

隠しパラメータ変更

試してないけれど、備忘録的に手順を残します。

隠しパラメータ変更は、oracleサポートの許可のもと変更すること

インスタンス再起動必要の可能性あり

--■変更前パラメータ確認

set linesize 130
col "parameter" for a30
col "description" for a50
col "value" for a20
SELECT
ksppinm as "parameter"
, ksppdesc as "description"
, ksppstvl as "value"
FROM x$ksppi
JOIN x$ksppcv USING (indx)
WHERE ksppinm IN ('[隠しパラメータ名]'); 

--■パラメータ変更

alter system set _ktb_debug_flags=8 scope = spfile;

--■変更後パラメータ確認

SELECT
ksppinm as "parameter"
, ksppdesc as "description"
, ksppstvl as "value"
FROM x$ksppi
JOIN x$ksppcv USING (indx)
WHERE ksppinm IN ('[隠しパラメータ名]');

 

表領域

対象表領域に存在するパーティションテーブルの構成を確認

SELECT OWNER,TABLE_NAME,PARTITIONING_TYPE,SUBPARTITIONING_TYPE,PARTITION_COUNT,DEF_SUBPARTITION_COUNT FROM ALL_PART_TABLES
WHERE OWNER='スキーマ名';
 

 パーティションの定義の確認

SELECT

    TABLE_OWNER,TABLE_NAME,

    SUBPARTITION_COUNT as "サブパーティション数",

    TABLESPACE_NAME,PARTITION_NAME as "パーティション名",

    NUM_ROWS as "パーティション内の行数"
FROM DBA_TAB_PARTITIONS WHERE TABLE_OWNER='スキーマ名'

    AND TABLE_NAME='テーブル名';
 

 

Data GuardとEC2

災害が起こった時のためのOracle Databaseのレプリケーション機能

 

Oracleでオンプレミスとクラウドのハイブリッドってできないかなと考えていて

EC2のように未使用時は、コストがかからないという考え方なら

バックアップ用DBはいけるのかな?と調べてみたらありました!

 

www.nkjmkzk.net

 

しかも、たまたま見つけた記事でしたが

私が尊敬するOracleエバンジェリストさんのブログじゃないですかΣ(・□・;)

 

さすがですね〜。同じ事すでに数年前に考えてたなんて感激です。

実際に実現できるかどうかは分かりませんが、私ももう少し調べてみたいと思います。

数年後の自分のために。

V$ACTIVE_SESSION_HISTORY取得

set linesize 10000
set pagesize 1000
set trimspool on
set long 75
col sample_time for a25
col event for a60
col user_name for a20
col sql_text for a80
select
dhash.inst_id inst_id
, dhash.sample_time sample_time
, dhash.session_id
, dhash.time_waited time_waited
, dhash.event event
, dhash.user_id user_id
, (select username from dba_users where user_id = dhash.user_id) user_name
, dhash.sql_id sql_id
, (select sql_text from gv$sqltext where inst_id = dhash.inst_id and sql_id = dhash.sql_id and piece = 0 and rownum = 1) sql_text
--, dhash.p1 p1
--, dhash.p2 p2
--, dhash.p3 p3
from gv$active_session_history dhash
where to_date('yyyymmddhh24mi', 'yyyymmddhh24mi') <= sample_time
and sample_time < to_date('yyyymmddhh24mi', 'yyyymmddhh24mi')

 Oracleマニュアル

V$SESSION

V$ACTIVE_SESSION_HISTORY

【Oracle】ログ解析 - アラートログ

アラートログ

トラブルが起きた時、まずアラートログを参照する

アラートログは以下のような情報が出力されます。

ADR_HOME配下のDIAGNOSTIC_DEST/diag/rdbms/alert/<DBNAME>/<ORACLE_SID>/trace/alter_<ORACLE_SID>.logに出力される

  • データベース起動、停止日時
  • 全てのデフォルト値以外の初期化パラメータ
  • バックグラウンド・プロセス起動
  • ログ順序番号
  • ログスイッチ情報
  • 表領域の作成
  • ALTER分の発行
  • エラーメッセージ

 

トレースファイル

 プロセスごとのログファイル

 SMON,PMONなどのバックグラウンドプロセスがエラーを受け取った時に、それらをログとして出力する。

/u01/app/oracle/diag/rdbms/<インスタンス名>/trace/.trc 

トレースの出力先ディレクトリを確認

SQL> select value from V$DIAG_INFO where name = 'Diag Trace';

VALUE
--------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/orcl/orcl/trace

 

参考資料

www.atmarkit.co.jp