これは予想される動作です。 MOSから文書番号1068820.1:
In 11g it is allowed to drop columns from a compressed table IF compatible is set to 11.1 or higher AND table was created with the "compress for all OLTP" option but even in this situation there is no real drop but internally the database sets the column UNUSED to avoid long-running decompression and recompression operations.
文書1223705.1,2171802.1などを参照してください。実際に列を削除する唯一の方法は、文書1987500.1に示されているように解凍して再圧縮することですが、これは上の引用符で避けていることです。
期待するエラーを得る方法はありません。
私はあなたが得ることができると思う最も近いDDLトリガーである:
create or replace trigger radu_trigger
before alter
on schema
declare
l_compress_for user_tables.compress_for%type;
begin
select max(compress_for) into l_compress_for
from user_tables
where ora_dict_obj_type = 'TABLE' and table_name = ora_dict_obj_name;
if l_compress_for is null or l_compress_for != 'OLTP' then
return;
end if;
for r in (
select column_name from user_tab_columns
where table_name = ora_dict_obj_name
)
loop
if ora_is_drop_column(r.column_name) then
raise_application_error(-20001,
'Do not drop columns from an OLTP-compressed table');
end if;
end loop;
end radu_trigger;
/
その後、あなたはどのOLTP-圧縮テーブルに列を削除しようとすると - そのスキーマに - あなたは、エラーが発生します:
alter table test_radu_a drop (col2);
alter table test_radu_a drop (col2)
Error report -
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: Do not drop columns from an OLTP-compressed table
ORA-06512: at line 18
...
あなたはもちろん、すべての圧縮されたテーブルをチェックしたくなかった場合は、特定のora_dict_obj_name
値を検索できます。
あなたは本当の例外模倣することができます:
create or replace trigger radu_trigger
before alter
on schema
declare
l_compress_for user_tables.compress_for%type;
l_exception exception;
pragma exception_init (l_exception, -39726);
begin
...
loop
if ora_is_drop_column(r.column_name) then
raise l_exception;
end if;
end loop;
end radu_trigger;
/
alter table test_radu_a drop (col2);
Error report -
ORA-00604: error occurred at recursive SQL level 1
ORA-39726: unsupported add/drop column operation on compressed tables
ORA-06512: at line 20
...
をそのメッセージが本当に真実ではありませんので、私は、それが混乱すると思います。あなた自身のオーダーメイドの例外を発生させるのは、おそらくより安全でクリーンです。