2012-01-13 13 views

Odpowiedz

6

Cytując MySQL Reference Manual:

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

DROP VIEW usuwa jeden lub więcej widoków. Musisz mieć uprawnienie DROP dla każdego widoku. Jeśli którykolwiek z widoków wymienionych na liście argumentów nie istnieje, MySQL zwraca błąd wskazujący po nazwie, które nieistniejące widoki nie były w stanie upuścić, ale także usuwa wszystkie istniejące widoki na liście.

Klauzula IF EXISTS zapobiega występowaniu błędu w widokach, które nie istnieją. Gdy podano tę klauzulę, generowany jest NOTE dla każdego nieistniejącego widoku. Zobacz Rozdział 12.7.5.41, "POKAŻ OSTRZEŻENIA Składnia".

RESTRICT i CASCADE, jeśli podano, są analizowane i ignorowane.

+4

Myślę, że jest pytając, jak upuścić wszystko w sposób zautomatyzowany. Nie można ręcznie wyszukiwać i pisać instrukcji drop dla dowolnej liczby widoków. – Cerin

2

wypróbować ten kod niesprawdzone

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

, które spowoduje spadek wszystkich widoków na serwerze, a nie w jednym db :) –

+0

Dziękuję, iv zaktualizowałem skrypt – CloudyMarble

-1

Oto metoda Ruby że będą robić to, co chcesz:

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

Używam tego:

/* 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

Najlepsza odpowiedź tutaj, dzięki. –

+1

Przyjemny scenariusz, thx. Z powodu GROUP_CONCAT, coś podobnego do SET GLOBAL group_concat_max_len = 1000000; może być użyteczny. –

+1

Musiałem "ustawić @@ group_concat_max_len = 100000;", aby to działało! Jeśli masz 100 widoków, a nazwa schematu plus nazwa widoku ma więcej niż 10 znaków, możesz z łatwością przekroczyć domyślny limit 1024. – Fx32

Powiązane problemy