2012-01-13 9 views

risposta

6

Citando MySQL Reference Manual:

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

DROP VIEW rimuove una o più viste. È necessario il privilegio DROP per ciascuna vista. Se nessuna delle viste nominate nell'elenco degli argomenti non esiste, MySQL restituisce un errore che indica per nome quali viste non esistenti non è stato in grado di eliminare, ma elimina anche tutte le viste nell'elenco che esistono.

La clausola IF EXISTS impedisce che si verifichi un errore per le viste che non esistono. Quando viene fornita questa clausola, viene generato un NOTE per ogni vista inesistente. Vedere Sezione 12.7.5.41, "SHOW WARNINGS Sintassi".

RESTRICT e CASCADE, se specificato, vengono analizzati e ignorati.

+4

Penso che sia chiedendo come abbandonare tutto in modo automatico. Non è come cercare manualmente e scrivere una dichiarazione di rilascio per un numero arbitrario di visualizzazioni. – Cerin

2

provare questo codice non testato

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

che lascerà cadere tutte le viste su un server, non in un db :) –

+0

Grazie, iv ha aggiornato lo script – CloudyMarble

-1

Ecco un metodo di Ruby che farà ciò che si vuole:

# @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

Sto usando questo:

/* 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 migliore risposta qui, grazie. –

+1

Bella sceneggiatura, grazie. E a causa di GROUP_CONCAT, qualcosa come SET GLOBAL group_concat_max_len = 1000000; potrebbe essere utile –

+1

Ho dovuto 'set @@ group_concat_max_len = 100000;' per farlo funzionare! Se hai 100 viste e il nome dello schema più il nome della vista è più lungo di 10 caratteri, puoi passare facilmente il limite 1024 predefinito. – Fx32

Problemi correlati