Postgresql

防止在 PostgreSQL 中刪除帶有索引的列

  • October 24, 2019

在 PostgreSQL 中,當您在表中刪除列時,所有使用該列的索引和約束也將被靜默刪除。如果你忽視這種情況,你可能會在生產中遇到嚴重的問題。

這是一個展示:

CREATE TABLE test (
   id INT     NOT NULL PRIMARY KEY,
   a  VARCHAR NOT NULL,
   b  VARCHAR NOT NULL
);
CREATE INDEX test_index ON test(a, b);

SELECT * FROM pg_indexes WHERE tablename='test';
/*
tablename | indexname
---------------------
test      | test_pkey
test      | test_index
*/ 

ALTER TABLE test DROP COLUMN b;
SELECT * FROM pg_indexes WHERE tablename='test';
/*
tablename | indexname
---------------------
test      | test_pkey
*/

當您刪除帶有索引的列時,是否有可能使 PostgreSQL 返回錯誤?或者也許有其他方法可以防止描述的情況?

除了編寫一個在某些使用者嘗試執行模式修改時引發異常的事件觸發器之外,沒有其他方法可以做到這一點。

您應該確保任何連接並且不知道比在不了解後果的情況下隨機刪除列更好的數據庫使用者不擁有任何數據庫對象並且沒有CREATE任何模式的特權。

引用自:https://dba.stackexchange.com/questions/251838