2012-01-13 24 views

Respuesta

6

Citando MySQL Reference Manual:

DROP VIEW [IF EXISTS] 
    view_name [, view_name] ... 
    [RESTRICT | CASCADE] 

DROP VIEW elimina uno o más puntos de vista. Debe tener el privilegio DROP para cada vista. Si alguna de las vistas nombradas en la lista de argumentos no existe, MySQL devuelve un error que indica por nombre qué vistas no existentes no pudo eliminar, pero también descarta todas las vistas en la lista que sí existen.

La cláusula IF EXISTS evita que se produzca un error para las vistas que no existen. Cuando se da esta cláusula, se genera un NOTE para cada vista inexistente. Consulte Sección 12.7.5.41, "SHOW WARNINGS Sintaxis".

RESTRICT y CASCADE, si se proporcionan, se analizan e ignoran.

+4

Creo que es preguntando cómo dejar todo de manera automatizada. No es cómo buscar manualmente y escribir una declaración desplegable para un número arbitrario de vistas. – Cerin

2

tratar este código no probado

DECLARE VIEW_NAME VARCHAR(31); 
DECLARE VIEW_NAMES CURSOR 
FOR 
SELECT table_name 
FROM information_schema.views; 
WHERE table_schema = 'DB_Name' 
OPEN VIEW_NAMES; 
REPEAT 
FETCH VIEW_NAMES INTO VIEW_NAME; 
DROP VIEW VIEW_NAME  
UNTIL done END REPEAT; 
CLOSE VIEW_NAMES; 
END; 
+1

que soltará todas las vistas en un servidor, no en un archivo db :) –

+0

Gracias, iv actualizó el script – CloudyMarble

-1

He aquí un método de Ruby que va a hacer lo que quiere:

# @param [Array] databases, e.g. ['db1', 'db2'] 
    def drop_all_views(databases) 
    views = ActiveRecord::Base.connection.execute("SELECT CONCAT(TABLE_SCHEMA,'.',TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_TYPE = 'VIEW' AND TABLE_SCHEMA IN('#{databases.join("', '")}');") 

    views = views.to_a.flatten 

    # Then drop all of those views from their respective databases 
    views.each do |v| 
     ActiveRecord::Base.connection.execute("DROP VIEW IF EXISTS #{v};") 
    end 
    end 
11

He estado usando este:

/* DROP ALL VIEWS */ 

SET @views = NULL; 
SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @views 
FROM information_schema.views 
WHERE table_schema = @database_name; -- Your DB name here 

SET @views = IFNULL(CONCAT('DROP VIEW ', @views), 'SELECT "No Views"'); 
PREPARE stmt FROM @views; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+0

La mejor respuesta aquí, gracias. –

+1

Buena secuencia de comandos, thx. Y debido a GROUP_CONCAT, algo así como SET GLOBAL group_concat_max_len = 1000000; podría ser útil. –

+1

Tuve que 'establecer @@ group_concat_max_len = 100000;' para que esto funcione! Si tiene 100 vistas y el nombre del esquema más el nombre de la vista tiene más de 10 caracteres, puede pasar fácilmente el límite predeterminado de 1024. – Fx32

Cuestiones relacionadas