We have a formal process for making changes where the user requests a
specific change. We (or they) create the ddl and send it along with the
request. When they want that change made in staging or production, they
ask it to be promoted and we simply run the ddl against that database.

Maintaining complete "create table" ddl was a "make work" task as far as
I was concerned. It is the changes to the tables that need to be
promoted - not complete ddl. I can generate complete ddl anytime I want
from the database.

We have a production database. We want to change tables, structure,
etc... We do this frequently. How do you script this? So far I have been
using upgrade directories.

upgrade

version1
version2

However, this leaves me with a problem. I can do an add column to a
table in version1, but then I have to change my base DDL of the table,
but how do I know that table works? Where would I test that my new
create table statement works? You can do all this manually, but its
slow, time consuming, and prone to bugs.