2009-07-10 21 views
9

Nền tảng cơ sở dữ liệu của tôi là với Oracle, vì vậy tôi ngạc nhiên khi phát hiện ra rằng Postgres bao gồm các thay đổi lược đồ trong các giao dịch - nếu bạn bắt đầu, hãy tạo một bảng và sau đó quay lại, bảng sẽ biến mất. Nó hoạt động để thêm và loại bỏ các cột là tốt. Rõ ràng điều này là rất tốt đẹp.Giới hạn về thay đổi lược đồ PostgreSQL bên trong các giao dịch?

Chúng tôi sắp thực hiện một số thay đổi đối với cách chúng tôi triển khai các lược đồ lược đồ dựa trên tính năng này. Trước khi chúng tôi làm, tôi muốn tìm hiểu xem bảo đảm giao dịch kéo dài đến mức nào, nhưng tôi không thể tìm thấy bất kỳ thông tin nào về nó trong tài liệu. Tôi cho rằng tôi chỉ sử dụng các thuật ngữ tìm kiếm sai - các tìm kiếm của tôi chỉ đi tới các danh sách lệnh lớn bao gồm các từ 'giao dịch', 'tạo' và 'bảng'.

Có ai cho tôi một số gợi ý về tài liệu hoặc thảo luận về thay đổi lược đồ giao dịch trong Postgres không? (Chúng tôi đang sử dụng 8.2.13, mặc dù chúng tôi sẽ nâng cấp trong tương lai không xa.) Hoặc chỉ một số chi tiết về tuyên bố sẽ không được đưa vào giao dịch?

+0

Có - tính năng đó là vô cùng hữu ích để viết kịch bản nâng cấp. –

+0

Gah - đó là cả hai câu trả lời hay. Cuối cùng yếu tố quyết định là grep là hy vọng một danh sách đầy đủ hơn. (Mặc dù nó không đề cập đến REINDEX.) Cảm ơn. – babbageclunk

+0

depesz đã có những đóng góp to lớn cho cộng đồng postgresql, chẳng hạn như thông qua blog của mình. Nếu bạn hỏi tôi - anh ấy xứng đáng có điểm danh tiếng cao! –

Trả lời

7

Theo grep nhanh chóng trên tài liệu, các lệnh này có thể không được thực hiện trong các giao dịch:

  • cụm
  • cam kết chuẩn bị
  • create database
  • tạo tablespace
  • loại bỏ cơ sở dữ liệu
  • thả
  • vùng bảng thả
  • rollback chuẩn bị
  • chân
+0

Bạn có muốn chia sẻ lệnh grep của mình không? –

+3

chắc chắn: grep 'không thể được thực hiện bên trong giao dịch' sql- * html –

+0

Cảm ơn. Các tài liệu reindex có nhiều khoảng trống giữa chính xác những từ đó. –

3

Tính đến phiên bản 9.1 của PosgreSQL, nó xuất hiện schema mà tạo báo cáo có thực sự giao dịch.

select * from pg_namespace where nspname = 'foo'; 
nspname | nspowner | nspacl 
---------+----------+-------- 
(0 rows) 

begin; 
create schema foo; 
rollback; 

select * from pg_namespace where nspname = 'foo'; 
nspname | nspowner | nspacl 
---------+----------+-------- 
(0 rows) 

begin; 
create schema foo; 
commit; 

select * from pg_namespace where nspname = 'foo'; 
nspname | nspowner | nspacl 
---------+----------+-------- 
foo  |  10 | NULL 
(1 row) 
+1

Điều này đã xảy ra trong nhiều năm, không có gì mới và không liên quan đến phiên bản 9.1 –

+0

Cảm ơn bạn đã làm rõ điều này liên quan đến phiên bản postgresql. – rantler

+0

Đã kiểm tra trong PostgreSQL 8.4 (phiên bản từ RHEL6). Và nó hoạt động! :-) Cảm ơn. – lzap

1

Hai phiên đồng thời chạy "CREATE TABLE" là một đặc sắc nhỏ:

http://postgresql.1045698.n5.nabble.com/Errors-on-CREATE-TABLE-IF-NOT-EXISTS-td5659080.html

CREATE TABLE không kiểm tra sơ bộ xem liệu một tên xung đột tồn tại. Nếu vậy, nó hoặc là lỗi ra (bình thường) hoặc thoát ra với một thông báo (trong trường hợp NẾU KHÔNG tồn tại). Nhưng có một điều kiện chủng tộc: một giao dịch xung đột có thể tạo bảng sau khi chúng tôi thực hiện kiểm tra đó và trước khi chúng tôi tự tạo.

Cả trình khởi tạo chuỗi được liên kết và tôi nhấn vào đây trong môi trường thử nghiệm tự động, do đó không quá khó chịu ở đó.(Tôi nghi ngờ điều đó sẽ ảnh hưởng đến sự di cư của giản đồ của bạn, nhưng nó có thể được xem như một giới hạn về những thay đổi DDL)

perl -MDBI -E 'fork; fork; $d=DBI->connect("dbi:Pg:dbname=$ENV{USER}");' \ 
$d->do("CREATE TABLE a (b int)")' 
DBD::Pg::db do failed: ERROR: 
    duplicate key value violates unique constraint "pg_type_typname_nsp_index" 
DETAIL: Key (typname, typnamespace)=(a, 2200) already exists. at -e line 1.