布団が俺を呼んでいる

丘山大一のぶろぐ

Firebird のお勉強 外部参照キーを一時的に取り外したい

う~ん、知識不足が原因の大半なわけですが。
Firebird、システムテーブルの構造がイマイチピンとこない。

背景

外部参照キーがあると、外部から適当にデータを流し込むときに邪魔になることがあります。
「外部参照キーを考慮して流し込めよ」と言われれば、そりゃそうなのですが、まあ邪魔なんです。

ISQL.exeを利用して、外部参照キーを取得する

データベースにConncet して、
SHOW TABLE ほげほげTable;
でとれます。

SQLでは?

えらく難しい。
丸一日ほどなやんでいましたが、最終的にこちらを参考にしました。
まとめてとるならこんな感じになるらしい。

select 
 PK.RDB$RELATION_NAME as PKTABLE_NAME
,ISP.RDB$FIELD_NAME as PKCOLUMN_NAME
,FK.RDB$RELATION_NAME as FKTABLE_NAME
,ISF.RDB$FIELD_NAME as FKCOLUMN_NAME
,(ISP.RDB$FIELD_POSITION + 1) as KEY_SEQ
,PK.RDB$CONSTRAINT_NAME as PK_NAME
,FK.RDB$CONSTRAINT_NAME as FK_NAME
from
 RDB$RELATION_CONSTRAINTS PK
,RDB$RELATION_CONSTRAINTS FK
,RDB$REF_CONSTRAINTS RC
,RDB$INDEX_SEGMENTS ISP
,RDB$INDEX_SEGMENTS ISF
WHERE  
 FK.RDB$CONSTRAINT_NAME = RC.RDB$CONSTRAINT_NAME 
and PK.RDB$CONSTRAINT_NAME = RC.RDB$CONST_NAME_UQ 
and ISP.RDB$INDEX_NAME = PK.RDB$INDEX_NAME 
and ISF.RDB$INDEX_NAME = FK.RDB$INDEX_NAME 
and ISP.RDB$FIELD_POSITION = ISF.RDB$FIELD_POSITION 
order by 1, 5 

FKTABLE_NAME が外部参照しているテーブルで、参照先がPK_TABLE_NAME になります。
あとはSELECT結果をもとに、外部キーを外したりつけたり。

外す
ALTER TABLE  ほげほげテーブル DROP CONSTRAINT INTEG_ほげほげ;

つける
ALTER TABLE ほげほげテーブル
ADD FOREIGN KEY (col1, col2)
REFERENCES ほげほげ参照先テーブル(colA, colB)

外すだけなら

こちらも参考にできそうです。
SQLというよりスクリプトですかね。



Firebird 徹底入門

新品価格
¥4,104から
(2016/7/14 23:43時点)

コメントを書く

布団が俺を呼んでいる | Windows Server 2019 で Windows Subsystem for Linux 2 補足編

布団が俺を呼んでいる

丘山大一のぶろぐ

Windows Server 2019 で Windows Subsystem for Linux 2 補足編

注意!
執筆時点で、Windows Server 2019 は公開停止中です。
ホスト、dockerイメージともに大幅に変わる可能性があります。

前回のWSL登録の補足。


手順その3のフォルダ決めの重要性について

フォルダを切ってexeを叩く、という操作をしているせいで、「ただexeを実行している」と感じますが、あくまでディストリビューションはWindows  Sub System for Linux の環境下にあります。
下記画像をご覧ください。


左側がデスクトップ上に置かれたフォルダ内にある「ubuntu1804.exe」を実行し、「ls」コマンドを叩いて「a.txt」を参照している状態です。
右側が別階層にある「ubuntu1804.exe」で実行し、「ls」を叩いている状態です。別exeを別パスで叩いているはずなのに、同じファイルを参照しています。

つまり、ubuntu1804.exe実行時に、別の環境変数が呼び出され、どのubuntu1804.exeを実行しようとも同じパスを見に行っているということになります。このパスは初回実行時に登録さるようです。
よって、初回実行時のフォルダを別の場所に移動させてしまうと、起動できなくなります。
下記はフォルダの千頭にアンダースコアをつけてから(リネームしてから)、「ubuntu1804.exe」を叩いた時のエラーです。


「指定されたパスが見つかりません。」となってしまいます。
※exe自体は参照できているので、ちょっと分かりづらいエラーですね
このパスは、レジストリの「HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss」以下に登録されているようです。




フォルダパスの変更

レジストリのbasepathを修正してしまえば、再度動作するようになることは確認しています。なので、困ったらパスを書き換えてしまうのも手です。
ただし、これは公式回答を見つけたわけではなく、「やってみたらできた」だけですし、今後のアップデートで状況が変わるかもしれません。(もしかしたら公式的にOKかもしれませんが、まだそのような表記を見つけていません)


wslの削除

やはり確実なのは、一度環境を削除してから再登録だと思います。
wsconfig.exeでディストリビューションを探し出し、削除(登録解除)します。
wslconfig.exe /l
wslconfig.exe /u ディストリビューション名



これで初期化されますので、自由にやりなおせます。


Ubuntuサーバー徹底入門

新品価格
¥4,104から
(2018/10/9 22:49時点)

コメントを書く