vertica-cascade危险操作

来源:互联网 发布:网络测速器手机版 编辑:程序博客网 时间:2024/05/12 17:34

实验证明:

drop table tmp.zhuga;

create schema zhuga;


create sequence zhuga.test_seq;

create table tmp.zhuga(name varchar(10),id int default nextval('zhuga.test_seq'));

insert into tmp.zhuga values('fafa','1');

创建一个seq,然后改变上面不同schema下的sequence,让其在同一个schema下
create sequence tmp.test2_seq;

ALTER TABLE tmp.zhuga ALTER COLUMN id SET DEFAULT nextval('tmp.test2_seq');

删除原来错误的,zhuga schema
drop schema zhuga ;

我们强制删除
drop schema zhuga cascade;
查看tmp.zhuga,奇怪的事情发生了,和zhuga schema不相关的表居然因为依赖被删除
select * from tmp.zhuga ;

select  nextval('zhuga.test_seq') ;
zhuga schema下的sequence也被删除
select nextval('tmp.test2_seq');
只有tmp下的schema没有被删除
再看
create schema zhuga1;

create table zhuga1.zhuga(name varchar(10));
insert into zhuga1.zhuga values('fafa');
select * from zhuga1.zhuga;

alter table zhuga1.zhuga set schema tmp;
select * from tmp.zhuga ;

drop schema zhuga1 cascade;
select * from tmp.zhuga ;

总结:cascade删除schema的时候,尤其涉及到sequence。内部机制是前面的数据在vertica内核中记录了zhuga.test_seq的数据信息,在我们改表的默认sequence(tmp.test2_seq)时候,里面的数据记录的还是以前的zhuga.test_seq并没有更改,然后cascade会将所有记录以前zhuga信息的数据删除,甚至包括表结构,下面实验可以看看,就连新产生的数据记录的新tmp.test2_seq都会被删除(是数据加表结构全部被删)
create schema zhuga;


create sequence zhuga.test_seq;

create table tmp.zhuga(name varchar(10),id int default nextval('zhuga.test_seq'));

insert into tmp.zhuga values('fafa','1');
select * from tmp.zhuga ;

这时数据记录的是zhuga.test_seq的sequence信息
create sequence tmp.test2_seq;

ALTER TABLE tmp.zhuga ALTER COLUMN id SET DEFAULT nextval('tmp.test2_seq');

insert into tmp.zhuga(name) values('fafa');
select * from tmp.zhuga ;

这时数据记录了zhuga.test_seq和tmp.test2_seq的信息
drop schema zhuga cascade;
select * from tmp.zhuga ;

全部被删,就连表结构都不剩

0 0