Tại sao một số DBMS không cho phép khôi phục lại các câu lệnh DDL nhất định?


21

Gần đây tôi phát hiện ra rằng MySQL không hỗ trợ khôi phục DDL như "bảng thay đổi" ... Được sử dụng cho PostgreQuery, điều đó làm tôi thấy kỳ lạ, nhưng một người bạn của tôi nói với tôi rằng ngay cả Oracle cũng không cho phép điều đó .. Có lý do kỹ thuật cho việc không hỗ trợ nó? Có phải nó chỉ đơn giản là một tính năng "không thú vị" đối với họ?

Chỉnh sửa: chỉ tìm thấy sự so sánh này . Dường như có rất nhiều DBMSes rằng làm hỗ trợ DDL giao dịch.


3
MySQL không cho phép DDL trong một giao dịch. Trước khi thực hiện các câu lệnh DDL, nó cam kết giao dịch hiện tại (tất cả các câu lệnh DML hiện tại bên trong giao dịch này!) Mà không có bất kỳ cảnh báo nào.
Frank Heikens

Chính xác, IMO khá khó chịu :)
Joril

Cá nhân tôi rất ngạc nhiên khi Postgres cho phép nó - bạn thậm chí có thể quay lại một DROPhoặc một RENAME?
Joe

1
Miễn là bạn không bỏ toàn bộ cơ sở dữ liệu, vâng :) Xem liên kết tôi vừa thêm
Joril

Vì vậy, chỉ có Oracle và MySQL không cho phép báo cáo DDL trong các giao dịch. Tính năng này thực sự cho phép triển khai lược đồ dễ dàng.
Mary

Câu trả lời:


19

Lý do tại sao điều này hoạt động trong PostgreSQL là các danh mục hệ thống là các bảng thông thường. Vì vậy, việc tạo một hàm mới, chẳng hạn, chỉ cần yêu cầu chèn một hàng vào pg_procbảng, thay đổi giá trị mặc định của cột chỉ cần thực hiện cập nhật cho một số hàng pg_attrdef, v.v. Vì các bảng là giao dịch dù sao đi nữa, bạn gần như phải đi ra ngoài để không làm cho nó hoạt động theo cách đó. (Rất nhiều chi tiết thực hiện đau đớn được bỏ qua ở đây.;))

Tôi cho rằng, không biết mã nguồn, các công cụ cơ sở dữ liệu khác sử dụng một số cấu trúc bên trong tùy chỉnh để thể hiện thông tin danh mục hệ thống của họ. Và vì vậy, họ sẽ phải nỗ lực nhiều hơn, rất nhiều nỗ lực có khả năng, để làm cho DDL giao dịch hoạt động và dường như đó không phải là ưu tiên của họ.

Mặt trái của điều này là đây là lý do tại sao các bản nâng cấp phiên bản lớn của PostgreSQL rất đau đớn. Các sản phẩm khác có thể thiết kế cấu trúc siêu dữ liệu nội bộ của chúng với các thay đổi và cập nhật trong tâm trí, và do đó không có vấn đề gì với việc nâng cấp lên phiên bản chính mới. Trong PostgreSQL, không có cách nào để thay đổi bảng danh mục hệ thống để đột nhiên trông giống như một phiên bản mới hơn của bảng danh mục hệ thống, ít nhất là không giữ cho hệ thống trực tuyến, vì điều đó sẽ yêu cầu quyền truy cập vào danh mục hệ thống. Urgh.


1
Chà, tôi thích DB của tôi ở trạng thái nhất quán mọi lúc hơn là dễ dàng nâng cấp phiên bản DB, nhưng tôi đoán đó là vấn đề về ý kiến ​​:) Cảm ơn lời giải thích của bạn!
Joril

Điều này có thể giải thích vấn đề cho một số cơ sở dữ liệu, nhưng danh mục hệ thống là các bảng thông thường trên Oracle.
Leigh Riffel

10

Hầu hết không? Bummer.

Tôi chủ yếu sử dụng SQL Server và nó không. Tôi biết Oracle không nhưng tôi nghĩ rằng Oracle có thể là một quang sai.

Trong SQL Server, tôi khá chắc chắn rằng bạn có thể chạy nhiều câu lệnh DDL trong một giao dịch mặc dù tôi cũng nghĩ rằng có một vài hạn chế (mà tôi đã quên hết). Bạn có thể tạo hoặc thay đổi hoặc bỏ hầu hết mọi thứ và cuộn lại, nếu bạn muốn. Red-Gate SQL So sánh (một công cụ tôi yêu thích) tận dụng lợi thế này.

Vấn đề với việc này là phạm vi giao dịch của bạn trở nên khá thú vị ... Khi bạn liên quan đến danh mục hệ thống trong giao dịch cập nhật (DDL), bạn sẽ gặp rủi ro khi lấy một số khóa thực sự quan trọng và bạn có thể chặn quyền truy cập vào danh mục hệ thống. Người dùng không thể làm gì nhiều nếu truy vấn của họ không thể tìm thấy bảng của họ trong danh mục!

Tuy nhiên, về số dư, thật tiện lợi khi có thể đưa DDL vào giao dịch đa lệnh.

Hữu ích hơn, lệnh DDL của SQL Server TRUNCATE cũng có thể là một thành phần của giao dịch đa câu lệnh . Bạn có thể cắt bớt một bảng mục tiêu (rất nhanh), xây dựng nó và sau đó thực hiện một cam kết nếu bạn thích kết quả. Nếu có gì đó không ổn, bạn quay lại và voila!, Giống như bạn chưa bao giờ làm phiền cái bàn. Không gian đăng nhập cũng được giảm thiểu. Tôi tận dụng điều đó khá thường xuyên.


2
Đây là một câu trả lời cho thấy một ví dụ về DDL ràng buộc giao dịch trong SQL Server. Ngoài ra, tôi luôn nghĩ rằng TRUNCATEkhông thể quay trở lại. Tôi đã sai.
Nick Chammas

5

Trong SQL Server, chúng ta có thể khôi phục các câu lệnh DDL, nó không sử dụng cam kết tự động ở cuối câu lệnh. Trong các DBMS khác tôi không biết, nhưng tôi nhớ rằng trong Oracle người ta không thể làm như vậy. Tôi tin rằng nó cụ thể cho từng DBMS, không chắc tiêu chuẩn SQL sẽ nói gì về điều này, nhưng tôi chắc chắn không có nhà sản xuất nào thực hiện 100% tiêu chuẩn.

Có một câu hỏi tương tự trên SO: Có thể chạy nhiều câu lệnh DDL trong một giao dịch (trong SQL Server) không?


5

Oracle đã chia sẻ phân tích truy vấn, do đó, CHỌN * TỪ bảng_a được thực hiện bởi một phiên là (thông thường) giống như của phiên khác. Điều đó sẽ phá vỡ nếu một phiên nghĩ rằng có mười cột trong bảng và một phiên khác nghĩ có mười một cột.


Thật thú vị khi bạn nói rằng, tôi đã gặp một vấn đề tương tự vào ngày khác, ứng dụng được cho là "nóng" có thể triển khai, nhưng thay đổi cấu trúc bảng cho phiên bản mới, nó không có cách nào để biên dịch lại JDBC PreparedStatements ngoài việc khởi động lại nó , Quá nhiều cho điều đó!
Gaius

2
Bên cạnh đó, phiên bản 11gR2 giới thiệu khái niệm Phiên bản để hỗ trợ nâng cấp nóng. Các kết nối hiện có hiệu quả sử dụng một phiên bản (với năm cột). Bạn bắt đầu một phiên bản mới, thêm một cột và bắt đầu một số kết nối mới bằng phiên bản mới cho các phiên mới. Khi tất cả các phiên xuất sắc đã kết thúc, phiên bản cũ là cruft và mọi thứ đều sử dụng phiên bản mới. Không quay ngược lại, nhưng bạn không đưa hoạt động mới vào phiên bản mới của mình cho đến khi tất cả hoạt động.
Gary
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.