2016-06-12 20 views
5

Tôi đã đọc về các quy tắc cho các hoạt động DML với các khung nhìn trong ORACLE. Hầu hết trong số họ có vẻ rõ ràng với tôi, nhưng tôi đang nhầm lẫn về chức năng tổng hợp.Tại sao tôi không thể xóa các hàng từ khung nhìn này có hàm tổng hợp trong mệnh đề select (ORACLE)?

Ví dụ: tôi có hai bảng.

   EMPLOYEES 
╔═══════════╦═════════════╦══════════╗ 
║ emp_id ║ salary ║ dept_id ║ 
╠═══════════╬═════════════╬══════════╣ 
║ 2134 ║ 2200  ║ 10 ║ 
║ 2327 ║ 3100  ║ 10 ║ 
║ 2428 ║ 4100  ║ 20 ║ 
║ 2637 ║ 1700  ║ 30 ║ 
╚═══════════╩═════════════╩══════════╝ 
     \ |/
     \|/ 
     | 
     | DEPARTMENTS 
╔═══════════╦═════════════╦══════════╗ 
║ dept_id ║ dname  ║ location ║ 
╠═══════════╬═════════════╬══════════╣ 
║ 10  ║    ║   ║ 
║ 20  ║    ║   ║ 
║ 30  ║    ║   ║ 
╚═══════════╩═════════════╩══════════╝ 

Tôi muốn có chế độ xem cho biết mức lương trung bình của nhân viên theo bộ phận. Vì vậy, tôi chạy SQL này:

CREATE OR REPLACE VIEW dept_sals AS 
    SELECT d.dept_id, round(avg(e.salary)) AS avg_salary 
    FROM employees e 
     JOIN 
     departments d 
     ON (e.dept_id = d.dept_id) 
    GROUP BY d.dept_id; 

Bây giờ tôi có một cái nhìn trông giống như:

╔═══════════╦════════════╗ 
║ dept_id ║ avg_salary ║ 
╠═══════════╬════════════╣ 
║ 10  ║ 2650 ║ 
║ 20  ║ 4100 ║ 
║ 30  ║ 1700 ║ 
╚═══════════╩════════════╝ 

Tôi hiểu tại sao tôi không thể chạy cập nhật phát biểu chống lại quan điểm này. Cột "avg_salary" không phải là dữ liệu, nó là một thông tin được tạo động. Nhưng tại sao tôi không thể xóa một hàng từ chế độ xem này?

Nếu tôi cố gắng để chạy:

delete from dept_sals where dept_id = 10; 

tôi nhận được:

ORA-01732: data manipulation operation not legal on this view 

gì tôi đang nghĩ:

bảng cơ sở BỘ có một one-to-one mối quan hệ với hàng theo quan điểm này. Tôi đoán Oracle có thể nhận {dept_id} từ chế độ xem và tạo SQL xóa hàng tương ứng khỏi bảng DEPARTMENTS. Điều này sẽ không làm hỏng tính nhất quán của bảng vì thông tin trong "avg_salary" không phải là dữ liệu, đó là một phép tính mà chúng ta có thể vứt bỏ khi bộ phận có {dept_id} không còn tồn tại nữa.

+0

Xóa khỏi chế độ xem đó sẽ xóa một cách hợp lý các hàng khỏi nhiều bảng hoặc chỉ một quan điểm theo ý kiến ​​của bạn? Mặc dù đó không phải là câu trả lời vì nó sẽ bị cấm ngay cả đối với một truy vấn được nhóm bảng duy nhất . –

+0

@ Martin Smith Tôi đang cố gắng tìm ra cách Oracle xem làm việc vì tôi không hiểu lý do xóa hạn chế trong tình huống này. Tôi đã thử nghiệm một trường hợp khi một khung nhìn với SQL = hai bảng tham gia, có cả hai khóa chính từ các bảng cơ sở trong các hàng của nó: một-một và một-nhiều. Tôi có thể xóa các hàng khỏi chế độ xem đó và chúng thực sự đã bị xóa khỏi bảng có quan hệ một-một. Bảng cơ sở có quan hệ một-nhiều với chế độ xem không bị ảnh hưởng với xóa. Tôi không thể hiểu tại sao Oracle không thể làm điều tương tự như ví dụ với avg. sals. Tôi nghĩ anh ta không cần bàn nhân viên để làm điều này. – Lynx

+2

Theo quan điểm của tôi, Oracle đã không tính toán tất cả các tình huống có thể xảy ra (có rất nhiều tình huống có thể có trong các truy vấn xem) và chỉ cần đặt một số quy tắc cơ bản để tách riêng các khung nhìn có thể cập nhật và không thể cập nhật. thực hiện bất kỳ chế độ xem nào (nếu cần) có thể cập nhật. – ivanzg

Trả lời

5

Điều bạn đang chỉ định là chế độ xem không thể cập nhật trong Oracle. Các quy tắc tách các khung nhìn có thể cập nhật và không thể cập nhật được quy định ở đây từ tài liệu Oracle.

"Một cái nhìn không thể được sửa đổi bởi UPDATE, INSERT hoặc DELETE nếu truy vấn xem có chứa bất kỳ của các cấu trúc sau:

A set operator 

A DISTINCT operator 

An aggregate or analytic function 

A GROUP BY, ORDER BY, MODEL, CONNECT BY, or START WITH clause 

A collection expression in a SELECT list 

A subquery in a SELECT list 

A subquery designated WITH READ ONLY 

Joins, with some exceptions, as documented in Oracle Database Administrator's Guide" 

liên kết ->https://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm

gì bạn muốn có thể và được giải quyết bằng cách sử dụng các trình kích hoạt của Oracle INSTEAD OF

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