作業ノート

様々なまとめ、雑感など

参照整合性制約で参照されるテーブルから、定義したテーブルと制約名を取得するSQL

以下はFOOテーブルのカラムを参照するテーブルと制約名を取得するSQL。

SELECT
    uc.table_name,
    uc.constraint_name
FROM user_constraints uc
JOIN user_constraints ruc ON
    ruc.owner = uc.r_owner AND ruc.constraint_name = uc.r_constraint_name
WHERE
    uc.constraint_type = 'R' AND ruc.table_name = 'FOO'
;

使用するのはuser_constraintsビュー。

constraint_typeRとなっているのが参照整合性制約の定義。これは該当テーブル名と制約名、参照先テーブルの一意制約名からなる。

参照整合性制約の定義を取得するビュー(uc)と、参照先の一意制約の定義を取得するするビューを(ruc)内部結合して、該当の定義を取得する。

参考

Oracleで特定テーブルの参照整合性制約を確認するSQL

今、Symfony2を使用した開発をしている。DBはOracle。

Symfony2のconsoleでORMの設定からSQLを作成することができる。利用しているDBの状況から最新にするために必要なSQLを作成できるので便利。しかし、その作成に時間がかなりかかるため、その調査をした。

実行ログをみると参照整合性制約を抽出するSQLに時間がかかっていたため、SQLを書き換えて改善されるか試してみた。そのとき作成したSQLが以下。

SELECT
  uc.constraint_name,
  uc.delete_rule,
  uc.search_condition,
  ucc.column_name,
  ucc.position,
  r_ucc.table_name  r_table_name,
  r_ucc.column_name r_column_name
FROM user_constraints uc
JOIN user_cons_columns ucc
  ON ucc.owner             = uc.owner
 AND ucc.constraint_name   = uc.constraint_name
JOIN user_cons_columns r_ucc
  ON r_ucc.owner           = uc.r_owner
 AND r_ucc.constraint_name = uc.r_constraint_name
 AND r_ucc.position        = ucc.position
WHERE
    uc.constraint_type = 'R'
AND uc.table_name = 'FOO'
ORDER BY uc.constraint_name ASC,
         ucc.position ASC
;

確認するために2つのビューを使用する。user_constraintsは、テーブルに定義された制約を示すビューでuser_cos_columnsはその制約で使用しているカラムを示すビュー。

user_constraints.constraint_typeは当該制約の種別でRは参照整合性を意味する。参照整合性制約の場合、user_constraints.owneruser_constraints.constraint_nameが参照元の制約であり、参照先の制約はuser_constraints.r_owneruser_constraints.r_constraint_name

それぞれのカラムをuser_cons_columnsの該当カラムと内部結合して、それぞれのテーブル名とカラム名を取得した。

ちなみに上記のSQLで試したところ元のSQLよりは改善されたが、それでも実行には数秒かかった。どうやらuser_constraintsをselectするだけでも時間がかかっているようだった。

参考

systemdの環境でapacheユーザのumask値を変更する

RHEL6までは/etc/sysconfig/httpdにumaskを書けば、/etc/init.d/httpdを実行することで変更できた。

RHEL7からはデーモンの管理がsystemdに変更になった。 systemdでも/etc/sysconfig/httpdは使用するが、そこで設定できるのは環境変数のみで、umaskを書いても変更されない。

systemdでumaskを変更する場合、デーモンの設定ファイルを作成し、そこにumask値を設定する。

cat <<'EOT' | sudo tee /etc/systemd/system/httpd.service > /dev/null
.include /lib/systemd/system/httpd.service
[Service]
UMask=002
EOT

設定したいのはumaskだけなので、もともと用意されているhttpd.serviceをincludeして他の設定を同じにする。

sudo systemctl --system daemon-reload

httpd.serviceファイルを作成したら、systemdをリロードする。

sudo systemctl restart httpd.service

httpdを既に起動しているなら、再起動する。

参考