La única otra opción es hacer manualmente lo que muchos sistemas RDBMS hacen de todos modos...
- Crear una nueva tabla
Luego puede copiar el contenido de la tabla anterior en un fragmento a la vez. Aunque siempre tenga cuidado con cualquier INSERCIÓN/ACTUALIZACIÓN/ELIMINACIÓN en la tabla de origen. (Podría ser manejado por un activador. Aunque esto causaría una ralentización, no es un bloqueo...)
Una vez que termine, cambie el nombre de la tabla de origen, luego cambie el nombre de la nueva tabla. Preferiblemente en una transacción.
Una vez que termine, vuelva a compilar cualquier procedimiento almacenado, etc. que use esa tabla. Es probable que los planes de ejecución ya no sean válidos.
EDITAR:
Se han hecho algunos comentarios acerca de que esta limitación es un poco pobre. Así que pensé en ponerle una nueva perspectiva para mostrar por qué es así...
- Agregar un nuevo campo es como cambiar un campo en cada fila.
- Los bloqueos de campo serían mucho más difíciles que los bloqueos de fila, sin importar los bloqueos de tabla.
- En realidad estás cambiando la estructura física del disco, cada registro se mueve.
- Esto realmente es como una ACTUALIZACIÓN en toda la tabla, pero con más impacto...