Digamos que eu tenha essas duas tabelas
CREATE TABLE users (
id_user serial primary key,
name text NOT NULL
);
CREATE TABLE useless_table (
id serial primary key,
id_user int4 NOT NULL,
CONSTRAINT useless_table_id_user_fk FOREIGN KEY (id_user) REFERENCES users(id_user)
);
users
é a tabela mais congestionada em todo o banco de dados, com consultas ininterruptas, mesmo as longas e importantes, então simplesmente não consigo matar todas elas. Quero descartar useless_table
isso, como você pode ver, tem uma referência de chave estrangeira users
e toda vez que eu lanço o DROP
comando, ele bloqueia mesmo com o mais simples SELECT
ativado users
(não há nenhuma consulta em andamento useless_table
). Eu até tentei soltar a chave estrangeira, useless_table
mas ela fica com os mesmos bloqueios da queda da tabela.
Talvez eu seja um sonhador, mas tem como não travar com tudo e simplesmente cair useless_table
?
Estou pensando em NOT VALID
chaves estrangeiras, desabilitando gatilhos, restrições adiáveis ou coisas desse tipo, mas não sou muito experiente sobre eles e não quero fazer bagunça usando-os.
Alguma sugestão?
Não. Os usuários de "users" precisam saber de alguma forma que não são mais obrigados a garantir a integridade referencial para "useless_table", e a única maneira segura de saberem disso é alterando os metadados de "users", o que requer uma fechadura.
Você precisará declarar uma janela de manutenção ou apenas ter a sorte de pegar "usuários" em um estado em que está desbloqueado. Você pode executar o seguinte em um loop até que, em alguma tentativa feliz, seja bem-sucedido (o nowait lançará um erro imediatamente se o bloqueio não estiver disponível). Você provavelmente gostaria de acelerá-lo para não fazer um loop o mais rápido possível, caso contrário, ele colocaria muita contenção em alguns LWLocks/spinlocks, o que você provavelmente não deseja.