Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Sử dụng NẾU TỒN TẠI (CHỌN ...) trong trình kích hoạt CHÈN TRƯỚC (Oracle)

Trước hết, nếu bạn đang sử dụng SQL * Plus, khi bạn tạo một đối tượng và được thông báo rằng có lỗi biên dịch, lệnh show errors sẽ chỉ cho bạn các lỗi.

Nếu bạn chạy show errors , bạn sẽ được thông báo rằng IF EXISTS không phải là cú pháp hợp lệ. Bạn có thể làm điều gì đó như

SELECT COUNT(*)
  INTO l_cnt
  FROM <<rest of query>>

IF( l_cnt > 0 )
THEN
  RAISE_APPLICATION_ERROR ...
END IF;

Tuy nhiên, khi bạn sửa lỗi biên dịch, bạn sẽ gặp phải lỗi thời gian chạy. Trong trình kích hoạt cấp hàng trên surveillance , nói chung bạn không thể truy vấn surveillance (bạn có thể làm được nếu tất cả những gì bạn đang làm là INSERT VALUES được đảm bảo chỉ chèn một hàng). Nếu bạn làm như vậy, bạn sẽ gặp phải lỗi kích hoạt thay đổi trong thời gian chạy.

Từ góc độ mô hình dữ liệu, khi bạn thấy mình thiết kế một bảng trong đó dữ liệu hợp lệ cho một hàng cụ thể phụ thuộc vào dữ liệu được lưu trữ trong các hàng khác của cùng một bảng, bạn nói chung đã vi phạm các nguyên tắc chuẩn hóa và bạn thường được phục vụ tốt hơn khi sửa lỗi mô hình dữ liệu cơ bản.

Nếu bạn thực sự quyết tâm giữ mô hình dữ liệu, tôi muốn tạo một chế độ xem cụ thể hóa làm mới khi cam kết, chỉ có dữ liệu cho các hàng vi phạm tiêu chí của bạn. Sau đó, bạn có thể đặt các ràng buộc đối với chế độ xem cụ thể hóa đó để đưa ra các lỗi tại thời điểm cam kết khi các tiêu chí của bạn bị vi phạm. Điều này sẽ yêu cầu nhật ký chế độ xem cụ thể hóa trên bảng của bạn.

Nếu bạn thực sự muốn giữ lại mô hình dữ liệu và bạn muốn thực thi logic với trình kích hoạt, bạn cần giải pháp kích hoạt ba phần cổ điển (hoặc trình kích hoạt kết hợp với ba phần nếu bạn đang sử dụng 11.2 trở lên). Bạn sẽ tạo một gói với một tập hợp các giá trị khóa chính. Một trình kích hoạt câu lệnh before sẽ khởi tạo bộ sưu tập. Trình kích hoạt cấp hàng sẽ chèn các khóa chính của các hàng đã được chèn và / hoặc cập nhật vào bộ sưu tập này. Và sau đó một trình kích hoạt câu lệnh sau sẽ lặp lại bộ sưu tập này và triển khai bất kỳ kiểm tra nào bạn muốn. Tuy nhiên, đó là rất nhiều mảnh ghép chuyển động, đó là lý do tại sao tôi thường khuyên chống lại nó.

Thêm vào đó, ngay cả khi bạn làm cho tất cả các phần này hoạt động, logic của bạn sẽ không bảo vệ bạn trong môi trường nhiều người dùng. Khi bạn có nhiều người dùng truy cập vào hệ thống cùng một lúc, hoàn toàn có thể xảy ra trường hợp một người dùng sẽ chèn một hàng, người dùng thứ hai sẽ chèn một hàng khác có phạm vi trùng lặp và sau đó mỗi phiên sẽ cam kết. Trong trường hợp đó, cả hai bộ trình kích hoạt sẽ cho phép thay đổi nhưng bạn vẫn sẽ bị bỏ lại dữ liệu trong bảng vi phạm yêu cầu của bạn. Chế độ xem cụ thể hóa, vì nó được thực thi tại thời điểm cam kết chứ không phải tại thời điểm chèn, sẽ hoạt động bình thường trong môi trường nhiều người dùng. Nếu bạn muốn trình kích hoạt hoạt động trong môi trường nhiều người dùng, bạn phải làm phức tạp thêm chúng bằng cách thêm logic bổ sung thực thi tuần tự hóa sẽ chặn insert của phiên thứ hai từ khi chạy cho đến khi phiên đầu tiên được cam kết hoặc quay trở lại. Điều đó làm tăng thêm độ phức tạp, giảm khả năng mở rộng và tùy thuộc vào cách nó được triển khai, có thể tạo ra một cơn ác mộng hỗ trợ.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi trong quy trình được lưu trữ của Oracle

  2. ODP.NET Oracle.ManagedDataAccess khiến phiên mạng ORA-12537 kết thúc tệp

  3. Làm thế nào để một Oracle NUMBER có Quy mô lớn hơn Độ chính xác?

  4. Làm thế nào để phát hiện xem cơ sở dữ liệu Oracle có hỗ trợ tự động tăng không?

  5. Cái gì tốt hơn? Truy vấn con hoặc kết hợp bên trong mười bảng?