Зависимость представления от представления позднего связывания - непредвиденное поведение - PullRequest
0 голосов
/ 12 декабря 2018

Меня смущает следующее поведение представлений с поздней привязкой в ​​Amazon Redshift.

У меня есть таблица test, представление с поздней привязкой test_view, которое читаетот test.Я могу drop table test, как и ожидалось, без необходимости каскадного спуска до test_view.

Как только я создаю «нормальное» представление test_view_2 для чтения из позднего связывания test_view, я не могуудалить таблицу test.

Кажется, что «нормальное» представление заставляет представление с поздним связыванием вернуться к «нормальному» представлению, что я не ожидал.

Есть ли способ обойти это?Я хотел бы:

  • Иметь возможность обновлять таблицы без каскадирования для всех зависимых представлений
  • Иметь возможность поддерживать дальнейшие нисходящие представления четко определенными, чтобы всплывать схемуошибки во время выполнения.

Для репликации:

dataeng=# create table test (id integer);
CREATE TABLE
dataeng=# insert into test values (1), (2), (3);
INSERT 0 3
dataeng=# create view test_view as select id from public.test with no schema binding;
CREATE VIEW
dataeng=# select * from test_view;
 id
----
  3
  1
  2
(3 rows)

dataeng=# drop table test;
DROP TABLE
dataeng=# create table test (id integer);
CREATE TABLE
dataeng=# insert into test values (1), (2), (3);
INSERT 0 3
dataeng=# create view test_view_2 as select id from public.test_view;
CREATE VIEW
dataeng=# select * from test_view_2;
 id
----
  2
  1
  3
(3 rows)

dataeng=# drop table test;
ERROR:  cannot drop table test because other objects depend on it
HINT:  Use DROP ... CASCADE to drop the dependent objects too.
dataeng=#

1 Ответ

0 голосов
/ 12 декабря 2018

Похоже, что определение «нормального» представления не ссылается на представление с поздним связыванием, а скорее пропускает весь путь до базовой таблицы.

То, что здесь происходит, это не , что представление с поздним связыванием становится нормальным представлением, а скорее то, что обычное представление оказывается в верхней части таблицы, несмотря на то, что оно было создано как выбранное.с точки зрения позднего связывания:

dataeng=# \d+ test_view
                        View "public.test_view"
 Column | Type | Collation | Nullable | Default | Storage | Description
--------+------+-----------+----------+---------+---------+-------------
View definition:
create view test_view as select id from public.test with no schema binding;

dataeng=# \d+ test_view_2
                         View "public.test_view_2"
 Column |  Type   | Collation | Nullable | Default | Storage | Description
--------+---------+-----------+----------+---------+---------+-------------
 id     | integer |           |          |         | plain   |
View definition:
 SELECT test_view.id
   FROM ( SELECT test.id
           FROM test) test_view;

dataeng=#
...