Nhanh chóng và hèn hạ
Trong Postgres 9,4+ sử dụng
SELECT to_regclass('foo');
Trả về NULL nếu không tìm thấy định danh trong đường dẫn tìm kiếm.
Trong Postgres 9.3 trở lên, sử dụng một biểu tượng đểregclass
:
SELECT 'foo'::regclass;
Điều này đặt ra một ngoại lệ , nếu không tìm thấy đối tượng!
Nếu 'foo'
được tìm thấy, oid
được trả lại trong text
đại diện của nó . Đó chỉ là tên bảng, đủ điều kiện theo lược đồ theo đường dẫn tìm kiếm hiện tại và được trích dẫn hai lần khi cần thiết.
Nếu không tìm thấy đối tượng, bạn có thể chắc chắn rằng nó không tồn tại ở bất kỳ đâu trong đường dẫn tìm kiếm - hoặc hoàn toàn không có tên đủ điều kiện cho lược đồ ( schema.foo
).
Nếu nó được tìm thấy có hai thiếu sót :
Tìm kiếm bao gồm các lược đồ ngầm định của search_path , cụ thể là pg_catalog
vàpg_temp
. Nhưng bạn có thể muốn loại trừ các bảng tạm thời và hệ thống cho mục đích của bạn. (?)
Một cast để regclass
làm việc cho tất cả các đối tượng trong danh mục hệ thống pg_class
: chỉ mục, khung nhìn, trình tự, vv Không chỉ các bảng. Bạn dường như đang tìm kiếm một bảng thông thường độc quyền. Tuy nhiên, có lẽ bạn cũng sẽ gặp vấn đề với các đối tượng khác cùng tên. Chi tiết:
Chậm và chắc chắn
Chúng tôi quay lại truy vấn của bạn, nhưng không sử dụng current_setting('search_path')
, sẽ trả về cài đặt trần. Sử dụng chức năng thông tin hệ thống chuyên dụng current_schemas()
. Mỗi tài liệu:
current_schemas(boolean)
name[]
Tên của các lược đồ trong đường dẫn tìm kiếm, tùy chọn bao gồm các lược đồ ngầm
"$user"
trong đường dẫn tìm kiếm được giải quyết thông minh. Nếu không có lược đồ nào có tên SESSION_USER
tồn tại, lược đồ không được trả về để bắt đầu. Ngoài ra, tùy thuộc vào chính xác những gì bạn muốn, bạn có thể xuất thêm các lược đồ ngầm ( pg_catalog
và có thể pg_temp
) - nhưng tôi giả sử bạn không muốn những lược đồ đó trong tay, vì vậy hãy sử dụng:
DO
$do$
BEGIN
IF EXISTS (
SELECT -- list can be empty
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = ANY(current_schemas(FALSE))
AND n.nspname NOT LIKE 'pg_%' -- exclude system schemas!
AND c.relname = 'foo'
AND c.relkind = 'r') -- you probably need this
THEN
RAISE 'This application depends on tables created by another application';
END IF;
END
$do$;
SQL Fiddle , thể hiện tất cả ngoại trừDO
câu lệnhcuối cùng.
SQL Fiddle (JDBC) có vấn đề với các DO
câu lệnh chứa các ký tự kết thúc.