Можно ли игнорировать ошибки при DROP VIEW IF EXISTS xxx (Найденный объект имеет тип TABLE)? - PullRequest
1 голос
/ 21 января 2020

Если есть

DROP VIEW IF EXISTS mydatabase.myschema.myname;

CREATE OR REPLACE TABLE  mydatabase.myschema.myname AS ...

, который завершается ошибкой с кодом ошибки 2203 SQL compilation error: Object found is of type 'TABLE', not specified type 'VIEW'..

Я намеревался создать сценарий для "преобразования" набора существующих представлений в таблицы ( периодически обновляется через задачи). Я хотел, чтобы скрипт был повторяемым, поэтому я подумал, что мог бы DROP VIEW IF EXISTS xxx отбросить представление, если оно существует, но кажется, что это не удастся, если уже есть таблица с таким именем. Таким образом, в первый раз, когда скрипт работает нормально, он отбрасывает представление и создает таблицу, но если я снова запустю скрипт, он потерпит неудачу, потому что теперь есть таблица с тем же именем.

Так есть ли способ игнорировать ошибку в DROP VIEW IF EXISTS xxx или просто запустить команду, если есть VIEW с таким именем?

Ответы [ 2 ]

1 голос
/ 22 января 2020

У вас есть несколько вариантов.

Вы можете прочитать свой скрипт из INFORMATION_SCHEMA, чтобы получить список представлений и удалить их. SQL получает список всех представлений, кроме INFORMATION_SCHEMA.

select * from INFORMATION_SCHEMA.VIEWS where TABLE_SCHEMA <> 'INFORMATION_SCHEMA';

Если вы просто хотите удалить имена представлений и избежать ошибок, вот хранимая процедура, которую вы можете вызвать, чтобы попытаться сбросить просмотр без генерации ошибки:

create or replace procedure DropView(viewName string)
returns string
language JavaScript
execute as OWNER
as
  $$  
    var sql_command = 
    'drop view ' + VIEWNAME;
    try {
            var stmt = snowflake.createStatement( {sqlText: sql_command} );
            var resultSet = stmt.execute();        
            while (resultSet.next())  {
                outString = resultSet.getColumnValue('status');
            }
        }
    catch (err)  {
        outString = err;   // Return a success/error indicator.
        }
   return outString;
  $$;

Если вы хотите l oop через каждую базу данных и схему во всей учетной записи, я написал для этого хранимую процедуру. Он предназначен для проверки зависимостей во всех представлениях, но может быть изменен и для их удаления.

https://snowflake.pavlik.us/index.php/2019/10/14/object-dependency-checking-in-snowflake

1 голос
/ 21 января 2020

Я бы предложил создать хранимую процедуру, которая просматривает все ваши представления и создает из них таблицы. В этой хранимой процедуре вы можете проверить, существует ли объект уже как таблица, и пропустить этот объект.

...