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

Cách search_path ảnh hưởng đến độ phân giải của mã định danh và lược đồ hiện tại

Đường dẫn tìm kiếm giản đồ search_path là gì ?

Hướng dẫn sử dụng:

Các bảng [...] thường được gọi bằng các tên không đủ tiêu chuẩn, chỉ bao gồm tên bảng. Hệ thống xác định bảng nào có ý nghĩa bằng cách đi theo đường dẫn tìm kiếm, đó là danh sách các lược đồ cần xem xét .

Tôi nhấn mạnh đậm. Điều này giải thích độ phân giải số nhận dạng .

“Lược đồ hiện tại” (hoặc "lược đồ mặc định"), theo tài liệu:

Lược đồ đầu tiên được đặt tên trong đường dẫn tìm kiếm được gọi là currentschema . Ngoài việc là lược đồ đầu tiên được tìm kiếm, nó còn là sơ đồ trong đó các bảng mới sẽ được tạo nếu CREATE TABLE các lệnh không chỉ định tên lược đồ.

Tôi nhấn mạnh đậm. Lược đồ hệ thống pg_temp (lược đồ cho các đối tượng tạm thời của phiên hiện tại) và pg_catalog tự động là một phần của đường dẫn tìm kiếm và được tìm kiếm đầu tiên , theo thứ tự này. Hướng dẫn sử dụng:

pg_catalog luôn là một phần hiệu quả của đường dẫn tìm kiếm. Nếu nó không được đặt tên rõ ràng trong đường dẫn thì nó được tìm kiếm ngầm trước tìm kiếm các lược đồ của đường dẫn. Điều này đảm bảo rằng các tên cài sẵn sẽ luôn có thể tìm được. Tuy nhiên, bạn có thể đặt pg_catalog một cách rõ ràng ở cuối đường dẫn tìm kiếm của bạn nếu bạn muốn có tên tích hợp ghi đè do người dùng xác định.

Nhấn mạnh đậm như mỗi bản gốc. Và pg_temp xuất hiện trước đó, trừ khi nó được đặt ở một vị trí khác.

Làm cách nào để đặt nó?

Có nhiều cách khác nhau để đặt biến thời gian chạy search_path .

  1. Đặt một cụm mặc định toàn bộ cho tất cả các vai trò trong tất cả cơ sở dữ liệu trong postgresql.conf (và tải lại). Hãy cẩn thận với điều đó!

    search_path = 'blarg,public'
    

    Giá trị mặc định được giao cho cài đặt này là:

    search_path = "$user",public
    

    Phần tử đầu tiên chỉ định rằng một lược đồ có cùng tên với người dùng hiện tại sẽ được tìm kiếm. Nếu không có lược đồ nào như vậy tồn tại, mục nhập sẽ bị bỏ qua.

  2. Đặt nó làm mặc định cho một cơ sở dữ liệu :

    ALTER DATABASE test SET search_path = blarg,public;
    
  3. Đặt nó làm mặc định cho vai trò bạn kết nối với (toàn cụm hiệu quả):

    ALTER ROLE foo SET search_path = blarg,public;
    
  4. Hoặc thậm chí (thường là tốt nhất!) Làm mặc định cho một vai trò trong cơ sở dữ liệu :

    ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
    
  5. Viết lệnh ở đầu tập lệnh của bạn. Hoặc thực thi nó trong phiên DB của bạn :

    SET search_path = blarg,public;
    
  6. Đặt một search_path cụ thể cho phạm vi của một chức năng (để an toàn trước những người dùng độc hại có đủ đặc quyền). Đọc về Viết SECURITY DEFINER Các chức năng An toàn trong sách hướng dẫn.

CREATE FUNCTION foo() RETURNS void AS
$func$
BEGIN
   -- do stuff
END
$func$ LANGUAGE plpgsql SECURITY DEFINER
       SET search_path=blarg,public,pg_temp;

Số cao hơn trong danh sách của tôi vượt trội hơn số thấp hơn.
Sách hướng dẫn có nhiều cách hơn nữa , chẳng hạn như thiết lập các biến môi trường hoặc sử dụng các tùy chọn dòng lệnh.

Để xem cài đặt hiện tại:

SHOW search_path;

Để đặt lại nó:

RESET search_path;

Hướng dẫn sử dụng:

Giá trị mặc định được xác định là giá trị mà tham số sẽ có, nếu không có SET đã từng được phát hành cho nó trong phiên hiện tại.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truyền kiểu dữ liệu postgres

  2. Oracle sang PostgreSQL:BẮT ĐẦU VỚI / KẾT NỐI BẰNG

  3. Toán tử PostgreSQL IN với hiệu suất kém truy vấn con

  4. Gấu trúc ghi khung dữ liệu vào lược đồ postgresql khác

  5. [Video] Giới thiệu về các kiểu dữ liệu JSON trong PostgreSQL