A simple log table and a standard script header and footer can help control database changes.
Add a table like this to your product:
create table script_log
(
id number,
description varchar2(4000),
was_successful varchar2(1) default 'N',
create_date date default sysdate,
create_by varchar2(30) default user,
constraint script_log_pk primary key (id),
constraint script_log_ck1 check (was_successful in ('Y', 'N'))
);
All changes should run using a standard tool and template. SQL*Plus is usually the best tool for database changes. It is not fancy, and it certainly has some quirks. But it can run anywhere and every Oracle professional knows it.
--Header, perhaps in a .SQL file that accepts parameters.
whenever sqlerror exit
variable script_id number
exec :script_id := 1;
insert into script_log(id, description) values(:script_id, 'First script.');
commit;
<add changes here>
--Footer, may also be in a .SQL file.
update script_log set was_successful = 'Y' where id = :script_id;
commit;
prompt Script done.
If someone tries to run the script a second time it will fail with this error:
*
ERROR at line 1:
ORA-00001: unique constraint (JHELLER.SCRIPT_LOG_PK) violated
A simple process and a little scripting can go a long way to help manage changes.
But don't be surprised if a simple solution like this is impossible at your company. For reasons I still don't understand this type of system is not part of the Oracle culture.