Oracleで2つのテーブルをアトミックな方法で交換するにはどうすればよいですか?
以下と同等のものを実行したいと思います。
ALTER TABLE foo RENAME foo_tmp;
ALTER TABLE foo_new RENAME foo;
しかし、テーブルfooがないときに、クエリがこれらの2行の間にテーブルfooを必要とする場合はどうなりますか?いくつかのロックが必要になります。
追伸質問のMySQLバージョンについては、 この質問 を参照してください。
新しいテーブルを指すパブリックシノニムを作成します。
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;
スキーマ所有者以外のユーザーに関連するテーブルにアクセスしている場合、状況は少し複雑になりますが、これは、スキーマ所有者のみがテーブルにアクセスしている場合に機能します。
すでに存在するテーブルにシノニムを作成することはできないと思います。次のエラーが発生するはずです: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;
シノニムが現在指しているテーブルを判別することで、アウトのテーブルのスワッピングをスクリプトアウトするのはかなり簡単です。