2009-05-06 12 views

Respuesta

25

generar una secuencia de comandos para truncar (= Eliminar todas las filas de) todas las tablas:

select 'truncate table ' || table_name || ';' from user_tables 

y luego ejecutar la secuencia de comandos.

+5

Edité esta respuesta, lo siento, pero el asunto all_tables fue bastante peligroso. –

+1

solución muy buena, muchas gracias – Lily

+3

Sólo para novatos: tenga en cuenta que 'truncado' no es transaccional, es decir, no se puede deshacer. –

2

¿Clonar el esquema y luego soltar las tablas antiguas?

+0

+1: solución más sencilla por mucho –

+1

O la forma de "DBA real" de hacerlo: copia de seguridad de la base de datos completa sin la d ata, y luego reconstruyó el DB (... el servidor ... de la placa base en adelante;). – BCS

+1

@TomH. ¿Cómo es esto simple? No soy un DBA, y no tengo idea de qué comandos ejecutar. –

4

El posible inconveniente con un truncado es que puede fallar en las restricciones de integridad referencial. Por lo tanto, primero debe deshabilitar las restricciones de clave externa, luego truncar y volver a habilitar las restricciones. El 'más' de clonar el esquema (exp e imp) es que también podría descartar y volver a crear el espacio de tablas (lo que puede hacer si desea reclamar un espacio físico en el disco como resultado de eliminar todos los datos) .

18

Para abordar la cuestión de las limitaciones, algo como esto debería funcionar:

BEGIN 

    FOR T in (SELECT table_name FROM user_tables) LOOP 
     EXECUTE IMMEDIATE 'ALTER TABLE '||T.table_name||' DISABLE ALL CONSTRAINTS'; 
    END LOOP; 

    FOR T in (SELECT table_name FROM user_tables) LOOP 
     EXECUTE IMMEDIATE 'TRUNCATE TABLE '||T.table_name; 
    END LOOP; 

    FOR T in (SELECT table_name FROM user_tables) LOOP 
     EXECUTE IMMEDIATE 'ALTER TABLE '||T.table_name||' ENABLE ALL CONSTRAINTS'; 
    END LOOP; 
END; 
+1

'alter table ...deshabilitar todas las restricciones' arroja una opción 'ORA-01735: ALTER TABLE no válida' si no hay ninguna restricción definida para la tabla, lo que provocaría que el script no truncara * cada * tabla si hay al menos una tabla sin restricción. Es posible que desee colocar 'execute immediate' dentro de un bloque' begin .. exception'. –

30

No hay un comando ALTER TABLE XXX DESACTIVAR todas las restricciones '

propongo esto;

BEGIN 
    FOR c IN (SELECT table_name, constraint_name FROM user_constraints WHERE constraint_type = 'R') 
    LOOP 
    EXECUTE IMMEDIATE ('alter table ' || c.table_name || ' disable constraint ' || c.constraint_name); 
    END LOOP; 
    FOR c IN (SELECT table_name FROM user_tables) 
    LOOP 
    EXECUTE IMMEDIATE ('truncate table ' || c.table_name); 
    END LOOP; 
    FOR c IN (SELECT table_name, constraint_name FROM user_constraints WHERE constraint_type = 'R') 
    LOOP 
    EXECUTE IMMEDIATE ('alter table ' || c.table_name || ' enable constraint ' || c.constraint_name); 
    END LOOP; 
END; 
+2

esta solución probablemente no sea la más votada porque a las personas no les interesa leer todas las respuestas aquí. –

-3

estos dos script de línea son la mejor

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 
GO 

EXEC sp_MSForEachTable 'DELETE FROM ?' 
GO 
+2

Esa es la forma más fácil de truncar todas las tablas en una base de datos de Microsoft SQL Server. Incluso si olvidó volver a habilitar las restricciones después de eliminar los datos. Pero ... esta pregunta es sobre Oracle ... no SQL Server. – K4timini

0

borrar todos los datos de todas las tablas en el oráculo

DECLARE 
    str VARCHAR2(100); 
BEGIN 
    FOR i IN 
    (SELECT object_name FROM user_objects WHERE object_type='TABLE' 
) 
    LOOP 
    str := 'Truncate table '|| i.object_name; 
    EXECUTE IMMEDIATE str; 
    DBMS_OUTPUT.PUT_LINE('table data deleted :' || i.object_name); 
    END LOOP; 
END;

Para más información: http://www.oracleinformation.com/2014/10/delete-all-the-data-from-all-tables.html

1

creé esta almacenado proc, utilizando las respuestas mencionadas anteriormente. Esto funciona perfectamente sin ningún error o excepción.

create or replace PROCEDURE DELETE_ALL_DATA 
AS 
cursor r1 is select * from user_constraints; 
cursor r2 is select * from user_tables; 
cursor r3 is select * from user_constraints; 
cursor r4 is select * from user_tables; 

BEGIN 

    FOR c1 IN r1 
    loop 
    for c2 in r2 
    loop 
     begin 
     if c1.table_name = c2.table_name and c1.status = 'ENABLED' THEN 
     dbms_utility.exec_ddl_statement('alter table ' || c1.owner || '.' || c1.table_name || ' disable constraint ' || c1.constraint_name); 
     end if; 
     EXCEPTION 
     WHEN NO_DATA_FOUND 
      THEN 
      continue; 
     WHEN OTHERS 
      THEN 
      continue; 
      end; 
    end loop; 
    END LOOP; 

    FOR T in (SELECT table_name FROM user_tables) LOOP 
     begin 
     EXECUTE IMMEDIATE 'TRUNCATE TABLE '||T.table_name; 
     EXCEPTION 
     WHEN NO_DATA_FOUND 
      THEN 
      continue; 
     WHEN OTHERS 
      THEN 
      continue; 
      end; 
    END LOOP; 

    FOR c1 IN r3 
    loop 
    for c2 in r4 
    loop 
     begin 
     if c1.table_name = c2.table_name and c1.status = 'DISABLED' THEN 
     dbms_utility.exec_ddl_statement('alter table ' || c1.owner || '.' || c1.table_name || ' enable constraint ' || c1.constraint_name); 
     end if; 
     EXCEPTION 
     WHEN NO_DATA_FOUND 
      THEN 
      continue; 
     WHEN OTHERS 
      THEN 
      continue; 
      end; 
    end loop; 
    END LOOP; 

    commit; 
END DELETE_ALL_DATA; 
0

Una ligera variación en la respuesta de Andomar para truncar todas las tablas para un usuario específico en lugar de sólo aquellos del usuario actual:

SELECT 'TRUNCATE TABLE ' || owner || '.' || table_name || ';' FROM all_tables WHERE owner = 'user/schema' 

Reemplazar el bit user/schema anteriormente con el nombre de usuario/esquema (entre las comillas) usted está interesado en.

Cuestiones relacionadas