参照整合性制約で参照されるテーブルから、定義したテーブルと制約名を取得する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_type
がR
となっているのが参照整合性制約の定義。これは該当テーブル名と制約名、参照先テーブルの一意制約名からなる。
参照整合性制約の定義を取得するビュー(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.owner
とuser_constraints.constraint_name
が参照元の制約であり、参照先の制約はuser_constraints.r_owner
とuser_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を既に起動しているなら、再起動する。