web-dev-qa-db-ja.com

Oracleでアトミックにテーブルを交換するにはどうすればよいですか?

Oracleで2つのテーブルをアトミックな方法で交換するにはどうすればよいですか?

以下と同等のものを実行したいと思います。

ALTER TABLE foo RENAME foo_tmp;
ALTER TABLE foo_new RENAME foo;

しかし、テーブルfooがないときに、クエリがこれらの2行の間にテーブルfooを必要とする場合はどうなりますか?いくつかのロックが必要になります。

追伸質問のMySQLバージョンについては、 この質問 を参照してください。

3
Hans Deragon

新しいテーブルを指すパブリックシノニムを作成します。

CREATE PUBLIC SYNONYM foo FOR foo_new;
RENAME foo TO foo_tmp;

-- At this point in time, any DMLs for foo will operate on foo_new, via the synonym 

RENAME foo_new TO foo;
DROP PUBLIC SYNONYM foo;

スキーマ所有者以外のユーザーに関連するテーブルにアクセスしている場合、状況は少し複雑になりますが、これは、スキーマ所有者のみがテーブルにアクセスしている場合に機能します。

4
Philᵀᴹ

すでに存在するテーブルにシノニムを作成することはできないと思います。次のエラーが発生するはずです:ORA-00955。パブリックシノニムは、オブジェクトをアドレス指定するときにスキーマを指定しない場合にのみ機能します。 select * from larry.fooではなく、select * from foo。さらに、パブリックシノニムは本質的にセキュリティリスクです。代わりに、グリーン/ブルーのデプロイメントに切り替えることができます。

オブジェクトを緑/青に設定します

-- rename your table/mv/view this will make your object unavailable one last time
alter table foo rename to foo_green;
-- create your synonym
create SYNONYM foo for foo_green;
-- make a new version of foo
create table foo_blue as select * from foo;
-- update your synonym.  This will swap the tables 
create or replace SYNONYM foo for foo_blue;

シノニムが現在指しているテーブルを判別することで、アウトのテーブルのスワッピングをスクリプトアウトするのはかなり簡単です。

1
Larry Symms