trigger todos los lista entre cuadro comparativo comandos clausulas sql sql-server transactions ddl jtds

todos - trigger ddl sql server



¿Es posible ejecutar múltiples sentencias DDL dentro de una transacción(dentro de SQL Server)? (4)

Me pregunto si es posible ejecutar múltiples sentencias DDL dentro de una transacción. Estoy especialmente interesado en SQL Server, aunque las respuestas con otras bases de datos (Oracle, PostgreSQL al menos) también podrían ser interesantes.

He estado haciendo algunos "CREAR TABLA" y "CREAR VISTA" para la tabla creada dentro de una transacción y parece haber algunas inconsistencias y me pregunto si los DDL no deberían hacerse dentro de la transacción ...

Probablemente podría mover el DDL fuera de la transacción, pero me gustaría obtener alguna referencia para esto. Lo que he encontrado hasta aquí:

  • Los niveles de aislamiento de la página MSDN en el motor de base de datos indican claramente que existen restricciones sobre las operaciones DDL que se pueden realizar en una transacción explícita que se ejecuta bajo aislamiento de instantáneas , pero no uso el aislamiento de instantáneas y esto debería generar un error.
    • Esto podría ser interpretado para que las operaciones DDL puedan realizarse en una transacción explícita bajo diferentes niveles de aislamiento.
  • La declaración # DDL de Oracle® Database Gateway para SQL Server declara que solo se puede ejecutar una declaración DDL en una transacción determinada . ¿Esto también es válido para el uso directo de SQL Server?

Para Oracle:

Si importa algo, estoy haciendo esto con Java a través del controlador JTBC JDBC.

br Touko


Para el caso general y IIRC, no es seguro asumir que las declaraciones DDL son transaccionales.

Es decir, hay una gran libertad de acción sobre cómo las alteraciones de esquema interactúan dentro de una transacción (suponiendo que lo haga). Esto puede ser por proveedor o incluso por la instalación particular (es decir, hasta el dba), creo. Por lo menos, no use un DBMS para suponer que otros tratarán las declaraciones DDL.

Editar: MySql es un ejemplo de DBMS que no admite transacciones DDL en absoluto. Además, si tiene replicación / duplicación de base de datos, debe tener mucho cuidado de que el servicio de replicación (la replicación de Sybase sea la norma, créalo o no) realmente replicará la instrucción DDL.


Podría ser que en MS SQL, las transacciones implícitas se desencadenen cuando se ejecutan las sentencias DDL y DML. Si desactivas esta opción, utiliza SET IMPLICIT_TRANSACTIONS

EDIT: otra posibilidad: no puede combinar CREATE VIEW con otras declaraciones en el mismo lote. CREATE TABLE está bien. Separe los lotes con GO.

EDIT2: PUEDE usar múltiples DDL en una transacción, siempre que se separen con GO para crear diferentes lotes.


Sé que la mayoría de las bases de datos tienen restricciones, pero Postgres no. Puede ejecutar cualquier creación de tabla numérica, cambios de columna y cambios de índice en una transacción, y los cambios no son visibles para la unidad de otros usuarios que COMMIT tiene éxito. ¡Así deberían ser las bases de datos! :-)

En cuanto a SQL Server, puede ejecutar DDL dentro de una transacción, pero SQL Server no versiona los metadatos , por lo que los cambios serían visibles para los demás antes de que la transacción se comprometa. Pero algunas declaraciones DDL pueden revertirse si está en una transacción , pero para cuáles funcionan y cuáles no, deberá ejecutar algunas pruebas.


Si está creando tablas, vistas, etc. sobre la marcha (que no sean variables de tabla o tablas temporales), es posible que realmente necesite replantear su diseño. Esto no es algo que normalmente debería suceder desde la interfaz de usuario. Incluso si debe permitir alguna personalización, las instrucciones DDL no deberían estar sucediendo al mismo tiempo que se ejecutan inserciones / actualizaciones / eliminaciones transaccionales. Es mucho mejor separar estas funciones.

Esto también es algo que necesita una dosis saludable de consideración y prueba en cuanto a qué sucede cuando dos usuarios intentan cambiar la estructura de la misma tabla al mismo tiempo y luego ejecutan una transacción para insertar datos. Hay algunas cosas realmente aterradoras que pueden suceder cuando permite a los usuarios hacer ajustes en la estructura de su base de datos.

Además, algunas declaraciones DDL siempre deben ser la primera declaración de un lote. Cuidado con eso también cuando los estés ejecutando.