Đườ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ể đặtpg_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
.
-
Đặ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.
-
Đặt nó làm mặc định cho một cơ sở dữ liệu :
ALTER DATABASE test SET search_path = blarg,public;
-
Đặ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;
-
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;
-
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;
-
Đặ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ếtSECURITY 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.