Швидкий і брудний
У Postgres використовують 9.4+
SELECT to_regclass('foo');
Повертає NULL, якщо ідентифікатор не знайдений у шляху пошуку.
У Postgres 9.3 або новіших версіях використовуйте ролик дляregclass
:
SELECT 'foo'::regclass;
Це створює виняток , якщо об’єкт не знайдено!
Якщо 'foo'
його знайдено, oid
повертається у своєму text
поданні. Ось лише назва таблиці, кваліфікована за схемою відповідно до поточного шляху пошуку та подвійне цитування, де необхідно.
Якщо об’єкт не знайдено, ви можете бути впевнені, що він не існує ніде в шляху пошуку - або зовсім не для імені, призначеного для схеми ( schema.foo
).
Якщо це знайдено, є два недоліки :
Пошук включає неявні схеми search_path , а саме pg_catalog
іpg_temp
. Але ви можете виключити тимчасові та системні таблиці за своїм призначенням. (?)
Заголовок regclass
працює для всіх об'єктів у системному каталозі pg_class
: покажчики, представлення, послідовності тощо. Не лише таблиці. Ви, здається, шукаєте виключно звичайний стіл. Однак у вас, ймовірно, будуть проблеми і з іншими однойменними об'єктами. Деталі:
Повільно і впевнено
Ми повернулися до вашого запиту, але не використовуємо current_setting('search_path')
, що повертає голові налаштування. Використовуйте спеціальну функцію інформаційної системи current_schemas()
. За документацію:
current_schemas(boolean)
name[]
назви схем у шляху пошуку, необов'язково включаючи неявні схеми
"$user"
на шляху пошуку вирішується розумно. Якщо схема з іменем не SESSION_USER
існує, схема не повертається для початку. Крім того, залежно від того, що саме ви хочете, ви можете додатково виводити неявні схеми ( 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
операторами, що містять символи завершення.