รวดเร็วและสกปรก
ใน Postgres 9.4+ ให้ใช้
SELECT to_regclass('foo');
ส่งคืนค่า NULL หากไม่พบตัวระบุในพา ธ การค้นหา
ใน Postgres 9.3 หรือเก่ากว่าให้ใช้นักแสดงเพื่อregclass
:
SELECT 'foo'::regclass;
สิ่งนี้ทำให้เกิดข้อยกเว้นหากไม่พบวัตถุ!
หาก'foo'
พบว่าoid
ถูกส่งคืนในการtext
เป็นตัวแทนของมัน นั่นเป็นเพียงชื่อตาราง schema ที่ผ่านการรับรองตามเส้นทางการค้นหาปัจจุบันและการเสนอราคาซ้ำในกรณีที่จำเป็น
หากไม่พบวัตถุคุณสามารถตรวจสอบให้แน่ใจว่าไม่มีวัตถุใด ๆ อยู่ในเส้นทางการค้นหาหรือไม่ใช้ชื่อที่ผ่านการรับรองจาก schema ( schema.foo
)
หากพบว่ามีข้อบกพร่องสองประการ :
การค้นหารวมถึงสคีนัยของSEARCH_PATHคือและpg_catalog
pg_temp
แต่คุณอาจต้องการยกเว้น temp และตารางระบบเพื่อวัตถุประสงค์ของคุณ (?)
cast เพื่อregclass
ทำงานกับวัตถุทั้งหมดในแค็ตตาล็อกระบบpg_class
: ดัชนีมุมมองลำดับ ฯลฯไม่เพียง แต่ตาราง คุณดูเหมือนจะมองหาตารางปกติโดยเฉพาะ อย่างไรก็ตามคุณอาจมีปัญหากับวัตถุอื่นที่มีชื่อเดียวกันด้วย รายละเอียด:
ช้าและแน่นอน
เรากลับไปที่การสืบค้นของคุณ แต่ไม่ได้ใช้current_setting('search_path')
ซึ่งจะคืนการตั้งค่าเปล่า current_schemas()
ใช้ฟังก์ชั่นระบบข้อมูลเฉพาะ ตามเอกสาร:
current_schemas(boolean)
name[]
ชื่อของสกีมาในเส้นทางการค้นหาทางเลือกรวมถึง schema โดยปริยาย
"$user"
ในเส้นทางการค้นหาได้รับการแก้ไขอย่างชาญฉลาด หากไม่มีสคีมาที่มีชื่อSESSION_USER
อยู่สคีมาจะไม่ถูกส่งกลับไปเริ่มต้นด้วย นอกจากนี้ขึ้นอยู่กับสิ่งที่คุณต้องการอย่างแน่นอนคุณยังสามารถเพิ่ม schema ที่เป็นนัย ( pg_catalog
และอาจเป็นไปได้pg_temp
) เพิ่มเติม - แต่ฉันคิดว่าคุณไม่ต้องการสิ่งเหล่านั้นสำหรับกรณีในมือดังนั้นใช้:
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สาธิตทั้งหมดยกเว้นDO
คำสั่งสุดท้าย
SQL Fiddle (JDBC) มีปัญหากับDO
คำสั่งที่มีอักขระการเลิกจ้าง