2009-10-31 18 views

Trả lời

38

Chế độ xem trong Oracle có thể có thể cập nhật trong các điều kiện cụ thể. Nó có thể phức tạp, và thường là không được khuyến khích.

Từ Oracle 10g SQL Reference:

Ghi chú về Updatable Lần

An xem có thể cập nhật là một trong những bạn có thể sử dụng để chèn, cập nhật hoặc xóa các hàng bảng cơ sở. Bạn có thể tạo chế độ xem để có thể cập nhật vốn có hoặc bạn có thể tạo trình kích hoạt INSTEAD OF trên bất kỳ chế độ xem nào để làm cho nó có thể cập nhật.

Để tìm hiểu xem các cột của chế độ xem có thể cập nhật vốn có thể được sửa đổi hay không, hãy truy vấn chế độ xem từ điển dữ liệu USER_UPDATABLE_COLUMNS. Thông tin được hiển thị bởi chế độ xem này chỉ có ý nghĩa đối với các chế độ xem có thể cập nhật vốn có. Đối với chế độ xem có thể cập nhật vốn có, phải đáp ứng các điều kiện sau:

  • Mỗi cột trong chế độ xem phải ánh xạ tới cột của một bảng. Ví dụ, nếu một cột xem ánh xạ tới đầu ra của một mệnh đề TABLE (một bộ sưu tập không cần thiết), thì khung nhìn không thể cập nhật được.
  • Quan điểm không được chứa bất kỳ của các cấu trúc sau:
    • Một nhà điều hành bộ
    • một nhà điều hành DISTINCT
    • Một tổng hợp hoặc chức năng phân tích
    • Một GROUP BY, ORDER BY, MODEL, CONNECT BY hoặc START WITH khoản
    • Biểu thức thu thập trong danh sách SELECT
    • Truy vấn con trong danh sách SELECT
    • Một subquery định với Read Only
    • tham gia, với một số trường hợp ngoại lệ, như tài liệu trong Hướng dẫn Oracle Database Administrator của

Bên cạnh đó, nếu một cái nhìn vốn đã có thể cập nhật chứa pseudocolumns hoặc biểu thức, thì bạn không thể cập nhật cơ sở các hàng trong bảng có câu lệnh UPDATE đề cập đến bất kỳ các pseudocolumn hoặc biểu thức nào.

Nếu bạn muốn có một cái nhìn tham gia để có thể cập nhật, sau đó tất cả các điều kiện sau đây phải đúng:

  • Tuyên bố DML phải chỉ ảnh hưởng đến một bảng cơ sở để tham gia.
  • Đối với câu lệnh INSERT, khung nhìn không được tạo VỚI CHECK OPTION, và tất cả các cột mà các giá trị được chèn vào phải đến từ một bảng được giữ nguyên khóa. Bảng được giữ nguyên khóa là bảng mà mỗi khóa chính hoặc giá trị khóa duy nhất trong bảng cơ sở cũng là duy nhất trong chế độ xem nối.
  • Đối với câu lệnh UPDATE, tất cả các cột được cập nhật phải được trích xuất từ ​​một bảng được giữ nguyên khóa. Nếu khung nhìn được tạo ra với CHECK OPTION, thì hãy nối các cột và các cột được lấy từ các bảng được tham chiếu nhiều hơn một lần trong khung nhìn phải được che chắn từ CẬP NHẬT. Đối với câu lệnh DELETE, nếu kết quả tham gia vào nhiều hơn một bảng được duy trì khóa, thì Cơ sở dữ liệu Oracle sẽ xóa khỏi bảng đầu tiên có tên trong mệnh đề FROM, cho dù chế độ xem đã được tạo CÓ CHECK OPTION hay chưa.
3

Có hai lần khi bạn có thể cập nhật một kỷ lục qua một cái nhìn:

  1. Nếu xem không có người tham gia hoặc cuộc gọi thủ tục và chọn dữ liệu từ một bảng cơ bản duy nhất.
  2. Nếu chế độ xem có INSTEAD OF INSERT trigger được liên kết với chế độ xem.

Nói chung, bạn không nên dựa vào việc có thể thực hiện chèn vào chế độ xem trừ khi bạn đã ghi cụ thể trình kích hoạt INSTEAD OF cho nó. Xin lưu ý, cũng có các trình kích hoạt INSTEAD OF UPDATE có thể được viết cũng như để giúp thực hiện các cập nhật.

+2

Chủ yếu là đúng, nhưng có thể cập nhật chế độ xem tham gia trong một số trường hợp. – DCookie

9

Oracle có hai cách khác nhau để làm cho quan điểm có thể cập nhật: -

  1. Quan điểm là "chìa khóa duy trì" sự tôn trọng với những gì bạn đang cố gắng để cập nhật với. Điều này có nghĩa là khóa chính của bảng bên dưới nằm trong khung nhìn và hàng xuất hiện chỉ một lần trong khung nhìn. Điều này có nghĩa là Oracle có thể xác định chính xác hàng của bảng cơ bản nào để cập nhật OR
  2. Bạn viết thay vì kích hoạt.

Tôi sẽ tránh xa các trình kích hoạt thay thế và yêu cầu mã của bạn cập nhật trực tiếp các bảng bên dưới thay vì thông qua chế độ xem.

+0

Có một 'và' hoặc' hoặc' giữa hai điều kiện này không? (Với tôi nó nghe có vẻ như hai ý tưởng riêng biệt .. – Thorsten

+0

Đó là một trong hai hoặc. – DCookie

0

YES, bạn có thể cập nhật và Chèn vào xem và chỉnh sửa sẽ phản ánh trên bảng gốc ....
NHƯNG
1 quan điểm nên có tất cả các KHÔNG NULL giá trị trên bàn
2-cập nhật phải có các quy tắc giống như bảng ... "cập nhật khóa chính liên quan đến khóa ngoài khác .. v.v ..."

Các vấn đề liên quan