3

Firebird と InterBase は、コンパイルされた形式のストアド プロシージャとトリガーを BLR (トークン化) 形式で保持します。

しかし、BLRの構造はよくわかりません。

フィールド サイズは BLR の一部ですか?

ストアド プロシージャに 2 つのフィールド (コピー元とコピー先) が含まれていて、後でこれら 2 つのフィールドのサイズを変更する場合、問題が発生しますか?

たとえば、それらはvarchar(50)長いものでしたが、今varchar(100)ではシステム テーブルの更新でそれらを変更しています。何が起こるか?50 文字だけをコピーしますか、それともすべて (100) 文字をコピーしますか?

それとも、BLR にはオブジェクト リンク (テーブルとフィールド) のみが含まれていますか?

「疑似」コードでデモンストレーションを試みます。

begin
  for select comp_id, comp_name from companies where ...
    into :ci, :cn 
    do begin
      -- somehow we're adding this to another table
      insert into new_clients (id, name) values (:ci, :cn);
    end
end;

これは、トリガーまたはストアド プロシージャである可能性があります。

  1. Comp_name、およびnew_clients.name最初はvarchar(50)です。
  2. この手順またはトリガーを追加します。1日問題なく稼働しています。
  3. 後で、これらのフィールドが短すぎてデータに適合しないことに気付きました。
  4. GUI (IBExpert など) を使用して、これらのフィールドを に変更しvarchar(150)ます。
  5. 大丈夫です、varchar(150)今は全員です。

ではどうなるでしょうか?

  1. BLR にフィールド サイズも含まれている場合は、フィールドのサイズを変更しても問題ありません。トリガー コピーは 50 文字で、以前の長さがプリコンパイルされているためです。
  2. BLR がテーブルとフィールドへのリレート/リンク/トークンのみを使用する場合、コピー機能を気にせずにフィールドを変更できます。

質問は同じです: BLR には関連するフィールドのサイズが含まれていますか?

4

1 に答える 1

4

まず、ISQL でプロシージャの BLR を確認できます。

SQL> create or alter procedure p1 (i1 varchar(10), i2 varchar(20)) return (o1 varchar(30)) as begin end!
SQL> ブロブをすべて設定!
SQL>コミット!
SQL> select rdb$procedure_blr from rdb$procedures where rdb$procedure_name = 'P1'!

blr_version5,
blr_begin、
   blr_メッセージ, 0, 4,0,
      blr_varying2, 0,0, 10,0,
      blr_short, 0,
      blr_varying2, 0,0, 20,0,
      blr_short, 0,
   blr_メッセージ, 1, 3,0,
      blr_varying2, 0,0, 30,0,
      blr_short, 0,
      blr_short, 0,
   blr_receive, 0,
    ...
blr_eoc

次に、絶対にシステム テーブルを変更しないでください。

第三に、はい、問題が発生します。ALTER PROCEDURE PARAMETERコマンドがないのはそのためです。

于 2013-04-21T17:32:19.960 に答える