powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / dependence table
24 сообщений из 24, страница 1 из 1
dependence table
    #33382174
Putnikw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Надо в старой базе разобраться, подскажите как увидеть с какими таблицами есть связи определенной таблицы. Или киньте ссылку если такое уже встречалось.

Заранее благодарен.
...
Рейтинг: 0 / 0
dependence table
    #33382565
teza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С каким Постгресом Вы работаете?
...
Рейтинг: 0 / 0
dependence table
    #33382592
Putnikw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PostgreSQL 7.4.6
Да сори наверно мало инфрмации дал. Я тут покопался и понял что енто можно вытянуть из pg_depend но не уверен что прав там есть objid, refobjid. Мне надо узнать какая таблица с какой связана и по каким полям (ключеввым) Вообщем направте в нужную сторону. Буду весьма благодарен.
...
Рейтинг: 0 / 0
dependence table
    #33382813
teza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я работаю в Постгресе, естественно, нельзя объять необъятное.
Решение Ваших проблем, или части, находится в системных таблицах.

Основа pg_class; там есть relname, relkind = имя таблицы, relkind=’r’ – таблица БД, то , с переводом на русский у меня трудно.
http://www.postgresql.org/docs/7.4/static/catalog-pg-class.html

Если в Вашей базе есть constraint , то будет полезна ссылка
http://www.postgresql.org/docs/7.4/static/catalog-pg-constraint.html


Я не играла со всеми системными таблицами, только с теми, которые мне нужны были для решения моих проф проблем, но я могу помочь с разборкой материала, со столбцами.
Вы читаете по-французски? Могу прислать мои примеры игры с системными таблицами

Что касатся pg_depend, для моих потребностей это была совершенно ненужная таблица.
Я не решаю Ваши задачи, даю наводку, Ваши потребности плохо очерчены в поставленной задаче, о какой зависимости Вы говорите? На фоне данного дока задавайте вопросы, если будут, я постараюсь просматривать эту тему

Поделитесь со сроками выполнения Вашего задания, можно делать срочно и плохо, и не очень быстро и намного лучше.
...
Рейтинг: 0 / 0
dependence table
    #33384073
Putnikw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ, но пока что не понятно как из pg_class вытянуть инфу с какой таблицой связана эта.
relkind char r = ordinary table, i = index, S = sequence, v = view, c = composite type, s = special, t = TOAST table - только указывает тип что это table как я понимаю.

>Поделитесь со сроками выполнения Вашего задания, можно делать срочно и плохо, и не очень быстро и >намного лучше.
Сроков пока нет. Пока все работает, но возможно нужна будет доработка. А пока есть возможность разбираться.

>Вы читаете по-французски?
К сожалению нет но по английски да, как и все наверное кто читает ету конфу.

Ваши потребности плохо очерчены в поставленной задаче, о какой зависимости Вы говорите?

Вот пример из доки:
Пусть у вас есть таблицы products и orders, но теперь вы хотите позволить таблице orders содержать несколько товаров (что не позволяет делать ранее использованная структура таблицы). Для этого можно использовать следующую структуру этих таблиц:

CREATE TABLE products (
product_no integer PRIMARY KEY,
name text,
price numeric
);

CREATE TABLE orders (
order_id integer PRIMARY KEY,
shipping_address text,
...
);

CREATE TABLE order_items (
product_no integer REFERENCES products,
order_id integer REFERENCES orders,
quantity integer,
PRIMARY KEY (product_no, order_id)
);

Вот мне надо увидеть все REFERENCES от одной таблицы к другой. ну про dependence это я конешно зря ляпнул, но если б был гуру по postgres и sql то не спрашивал бы.
...
Рейтинг: 0 / 0
dependence table
    #33384287
Hordi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не пойму - зачем такой изврат? Поставь себе pgadmin и посмотри все связи... Там запросы на создание таблиц показаны - в них видны все связи...
...
Рейтинг: 0 / 0
dependence table
    #33385305
Putnikw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
дельный совет согласен. А что с командной строки никак?
...
Рейтинг: 0 / 0
dependence table
    #33385424
teza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что касается pgadmin, тоже решение, но какова верятность ошибки, на сколько хорошо можно восстановить структуру незнакомой БД, особенно если количество таблиц достаточно большое? Дело практики и опыта, но я считаю, что это не самый элегантный способ. Я уже не говорю, что связи между таблицами не исчерпываются только constraintами. Но, в самом деле, это - личное дело каждого.
...
Рейтинг: 0 / 0
dependence table
    #33385477
teza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я написала сегодня уже один ответ, но только сейчас обнаружила, что он не отправился. Жалко, потому что теперь придется работать с моим примером. И у меня здесь нет под рукой постреса.
Мои таблицы:

-- Table: public."AchatsDetails"
CREATE TABLE "AchatsDetails" (
"N°Achat" int4 NOT NULL,
"N°Detail" int4 NOT NULL,
"DateDetail" date,
"Libelle" text,
"Quantite" float8,
CONSTRAINT "AchatsDetails_pkey"
PRIMARY KEY ("N°Achat", "N°Detail"),
CONSTRAINT "AchatsDetails_fk"
FOREIGN KEY ("N°Achat")
REFERENCES "Achats" ("N°Achat")
ON DELETE CASCADE ON UPDATE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE
) WITH OIDS;

-- Table: public."AchatsReceptions"
CREATE TABLE public."AchatsReceptions" (
"DateReception" date,
"Quantite" float8,

"N°thisDetail" int2 NOT NULL,
"N°thisAchat" int4 NOT NULL,

"N°Reception" int2 NOT NULL,
CONSTRAINT "AchatsReceptions_pkey"
PRIMARY KEY ("N°thisAchat", "N°thisDetail", "N°Reception"),
CONSTRAINT "AchatsReceptions_fk"
FOREIGN KEY ("N°thisAchat", "N°thisDetail")
REFERENCES "AchatsDetails" ("N°Achat", "N°Detail")
ON DELETE CASCADE ON UPDATE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE
) WITH OIDS;

Я делаю запрос:
tablefk - это таблица, которая содержит FOREIGN KEY, или REFERENCES.
В моем примере это - AchatsReceptions. В вашем примере, это таблица order_items.
reftable - это таблица, на которую(-ые) ссылаются. У меня - AchatsDetails.
У вас - products, orders.
conkey - массив номеров столбцов, отмеченных как PRIMARY KEY в таблице tablefk, которые ссылаются на PRIMARY KEY таблиц reftable. У меня эти столбцы в AchatsReceptions отмечены красным. И так "N°thisAchat" - 4, "N°thisDetail" - 3. У вас в order_items столбец product_no - 1, order_id - 2,
confkey - массив номеров столбцов, отмеченных как PRIMARY KEY в таблице reftable, которые являются FOREIGN KEY в таблице reftable и на которые ссылаются conkey. во выдала ...
У меня эти столбцы в AchatsDetails отмечены синим. И так "N°Achat" - 1, "N°Detail" - 2. У вас - orders.order_id - 1, products.product_no - 1.

Теперь WHERE:
1. По имени constraint в таблице tablefk
2. По имени tablefk
3. По имени reftable
Три варианта, что удобнее, только переставляете комментарий

SELECT
tablefkname.relname as tablefk,
pg_constraint.conkey,
reftablename.relname as reftable,
pg_constraint.confkey
FROM pg_constraint
INNER JOIN pg_class as tablefkname ON tablefkname.oid=pg_constraint.conrelid
INNER JOIN pg_class as reftablename ON reftablename.oid=pg_constraint.confrelid WHERE pg_constraint.conname='AchatsReceptions_fk'
-- WHERE tablefkname.relname='AchatsReceptions'
-- WHERE reftablename.relname='AchatsDetails'

ответ для моего примера:
tablefk : conkey :reftable : confkey
AchatsReceptions :{4,3} :AchatsDetails : {1,2}

для вашего пишу, не проверяя в постгресе
tablefk :conkey: reftable : confkey
order_items : {1} : product_no : {1}
order_items : {2} : orders : {1}
В массивах conkey и confkey очень важен порядок: conkey4 - confkey1,
conkey3 - confkey2.

Мой пример более сложный.
продолжение следует
...
Рейтинг: 0 / 0
dependence table
    #33386294
Hordi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще можно из psql командой \d table_name посмотреть информацию о полях таблицы - там все связи с другими таблицами будут вины.

Еще вариант поискать программы, которые рисуют структуры базы - там взаимосвязи всегда отображаются (типа ErWin).
...
Рейтинг: 0 / 0
dependence table
    #33386398
Putnikw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
насчет \d table - ничего оно не покажет вот пример из базы (слепил на ходу)
\d reception
Table "public.reception"
Column | Type | Modifiers
---------------+-----------------------------+---------------------------------------------------------------------
invoice_code | bigint | not null default nextval('public.reception_invoice_code_seq'::text)
data | timestamp without time zone |
cost_pdv_n | money |
pdv_there | money |
provider_name | text |
transport | money | default '$0.00'::money
transport_pdv | money | default '$0.00'::money
cost_our | money |
invoice_num | text |

и где связи? а они есть сам делал.

А вот за примерчик спасибо бум разбираться.
...
Рейтинг: 0 / 0
dependence table
    #33388057
Фотография Niemi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пустышка получилась, но связи видно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
--
CREATE TABLE mytbl (
mytbl_id SERIAL,
mytbl_1  VARCHAR,
mytbl_2  VARCHAR,
CONSTRAINT mytbl_mytbl_id_pk PRIMARY KEY (mytbl_id)
);
--
CREATE TABLE yourtbl (
yourtbl_id SERIAL,
yourtbl_1 VARCHAR,
yourtbl_2 VARCHAR,
CONSTRAINT yourtbl_mytbl_fk FOREIGN KEY (yourtbl_id) REFERENCES mytbl(mytbl_id)
);
--
--
testingdb=# \d mytbl
                                    Table "postgres.mytbl"
  Column  |       Type        |                           Modifiers                                                                                 
----------+-------------------+---------------------------------------------------------------
 mytbl_id | integer           | not null default nextval('postgres.mytbl_mytbl_id_seq'::text)
 mytbl_1  | character varying |
 mytbl_2  | character varying |
Indexes:
    "mytbl_mytbl_id_pk" primary key, btree (mytbl_id)
 
testingdb=#
testingdb=# \d yourtbl
                                      Table "postgres.yourtbl"
   Column   |       Type        |                             Modifiers                                                                                 
------------+-------------------+-------------------------------------------------------------------
 yourtbl_id | integer           | not null default nextval('postgres.yourtbl_yourtbl_id_seq'::text)
 yourtbl_1  | character varying |
 yourtbl_2  | character varying |
Foreign-key constraints:
    "yourtbl_mytbl_fk" FOREIGN KEY (yourtbl_id) REFERENCES mytbl(mytbl_id)
 
testingdb=#

testingdb=# select version();
                                       version                                                                                 
-------------------------------------------------------------------------------------
 PostgreSQL  7 . 4 . 2  on i686-pc-linux-gnu, compiled by GCC gcc (GCC)  3 . 3 . 3  (SuSE Linux)
( 1  row)
 
testingdb=#

...
Рейтинг: 0 / 0
dependence table
    #33388573
teza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эгов, Putnikw
Вы попробывали то, что я вам предложила в сообщении 17 ноя 05, 22:12? Вам интересно это решение? Я просто не знаю, продолжать или нет? напишите мне, пожалуйста.
...
Рейтинг: 0 / 0
dependence table
    #33388576
raul_83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Программа Aqua Data Studio 4.5 - весит мегабайт 8 триальная версия - рисует схему базы (ER) и позволяет сохранить её в jpg - получается более - менее наглядно
...
Рейтинг: 0 / 0
dependence table
    #33388577
teza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По вашему примеру
SELECT
tablefkname.relname as tablefk,
pg_constraint.conkey,
reftablename.relname as reftable,
pg_constraint.confkey
FROM pg_constraint
INNER JOIN pg_class as tablefkname ON tablefkname.oid=pg_constraint.conrelid
INNER JOIN pg_class as reftablename ON reftablename.oid=pg_constraint.confrelid

WHERE tablefkname.relname='order_items'
...
Рейтинг: 0 / 0
dependence table
    #33389587
Putnikw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да спасибо teza. Ваш пример вполне рабочий. А вот с своим прbмером слеплиным на ходу (reception) я явно напутал. Не указал на на какие поля ссылаться. Проверял по \d orders; \d products;\d order_items - действительно показывает связи. Странно что у меня ерунда получалась.

P.S. Всегда приятно получить ответ спеца. :-).
...
Рейтинг: 0 / 0
dependence table
    #33392289
teza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Естественно, вы можете использовать все системные таблицы из
http://www.postgresql.org/docs/7.4/static/catalogs.html
Начинать работать с ними трудно, потом становиться более понятно.

Одно очень важное замечание. Это не связано впрямую с вашей задачей, но в свое время мое невнимание на этот факт мне стоил дорого.
В системной таблице pg_attribute (stores information about table columns), есть столбец attisdropped (bool), объяснение в доке :
This column has been dropped and is no longer valid. A dropped column is still physically present in the table, but is ignored by the parser and so cannot be accessed via SQL.
Уничтоженный столбец никуда не исчезает, он становится просто недоступен для несистемный запросов, но у него существует свой порядковый номер. Таким образом, вы можете попасть, что у вас после 2-го столбца идет 4-ый: проверяйте всегда attisdropped = false при работе со столбцами.

И еще два запроса для поиска имен первичных и вторичный ключей:
--- SQL for PRIMARY KEY of table = pg_class.relname;
SELECT pg_constraint.conkey, pg_attribute.attname
FROM pg_constraint
INNER JOIN pg_attribute ON pg_constraint.conrelid=pg_attribute.attrelid
AND pg_attribute.attnum=ANY(pg_constraint.conkey)
INNER JOIN pg_class ON pg_constraint.conrelid=pg_class.oid
AND pg_constraint.contype='p'
AND pg_class.relkind='r'
AND pg_class.relname='order_items'

--- SQL for FOREIGN KEY of table=pg_class.relname
SELECT pg_class.relname, pg_constraint.conname,
pg_constraint.confkey, pg_attribute.attname
FROM pg_constraint
INNER JOIN pg_class ON pg_constraint.conrelid=pg_class.oid
AND pg_constraint.contype='f'
AND pg_class.relkind='r'
AND pg_class.relname='order_items'
INNER JOIN pg_attribute ON pg_constraint.confrelid=pg_attribute.attrelid
AND pg_attribute.attnum=ANY(pg_constraint.confkey)

Ну а теперь запрос для определения пользовательских таблиц БД.
pg_namespace.nspname - это имя схемы, где расположена база. У меня эта схема 'public':

SELECT *
FROM pg_class
INNER JOIN pg_namespace ON pg_class.relnamespace=pg_namespace.oid
WHERE relkind='r'
AND pg_namespace.nspname='public'

Чтобы просмотреть все схемы:
SELECT oid,* FROM pg_namespace

В принципе, это по-моему вся необходимая информация для решения вашей задачи. Было бы хорошо написать функцию, которая для каждой пользовательской таблицы выдавала бы PRIMARY KEY и FOREIGN KEY, да и другие данные, например inherits, если нужно.
У меня готовой такой функции нет, но если вас интересует, могу настучать
...
Рейтинг: 0 / 0
dependence table
    #33392371
Putnikw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо teza за ваши ответы! Я и не думал что узнаю так много полезной информации.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
dependence table
    #35074484
Yuriy Yurchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подниму тему из мезонина....
А никто не подскажет, есть ли возможность отследить зависимости функций от других как функций, так и таблиц базы? Доку курил, но пока безуспешно :-(
...
Рейтинг: 0 / 0
dependence table
    #35077831
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yuriy Yurchenkoесть ли возможность отследить зависимости функций от других как функций, так и таблиц базы?ответа на этот вопрос не знаю. :-(

но странно, что постгрес (версия 8.1) не позволяет создать функцию при отсутствии таблицы (от которой зависит) и при этом позволяет удалить таблицу и получить невалидную функцию. напрашиваются вопросы: наверное вообще эти зависимости не хранятся в системных таблицах? и наверное валидация тела функции проводится лишь на этапе ее создания?

Код: plaintext
1.
2.
3.
4.
5.
6.
create function f1() returns setof integer as 'select 1 from t1' language 'sql';
create table t1 ( id integer );
create function f1() returns setof integer as 'select 1 from t1' language 'sql';
select * from f1();
drop table t1;
select * from f1();
drop function f1();

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
nalbat=> create function f1() returns setof integer as 'select 1 from t1' language 'sql';
ERROR:  отношение "t1" не существует
CONTEXT:  SQL-функция "f1"
nalbat=> create table t1 ( id integer );
CREATE TABLE
nalbat=> create function f1() returns setof integer as 'select 1 from t1' language 'sql';
CREATE FUNCTION
nalbat=> select * from f1();
 f1
----
( 0  rows)

nalbat=> drop table t1;
DROP TABLE
nalbat=> select * from f1();
ERROR:  отношение "t1" не существует
CONTEXT:  SQL-функция "f1" при старте
nalbat=> drop function f1();
DROP FUNCTION
...
Рейтинг: 0 / 0
dependence table
    #35079898
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatно странно, что постгрес (версия 8.1) не позволяет создать функцию при отсутствии таблицы (от которой зависит) и при этом позволяет удалить таблицу и получить невалидную функцию. напрашиваются вопросы: наверное вообще эти зависимости не хранятся в системных таблицах? и наверное валидация тела функции проводится лишь на этапе ее создания?проверять или нет определение функции при создании завист от переменной check_function_bodies по умолчанию она включена и выключается в дампах базы что-бы при их заливке не было проблем с перекрёстными ссылками.

ps: по теме ответа тоже не знаю %) а в связи с кол-вом поддерживаемых языков - даже сложно представить как такое вообще можно было бы реализовать... допустим у нас скомпилированная хранимка на C во внешней библиотеке и она внутри себя обращается к хранимке на Java которая вызывает хранимку на perl ну и тд... %)
если брать функции например на С то насколько я понимаю максимум что check_function_bodies может проверить для вот например такой функции:
Код: plaintext
1.
2.
CREATE FUNCTION plpgsql_call_handler() RETURNS language_handler
    AS '$libdir/plpgsql', 'plpgsql_call_handler'
    LANGUAGE c;
это то что библиотека plpgsql существует по указанному пути и что она экспортирует символ plpgsql_call_handler. само тело то уже скомпилировано и его никак не проверить уже... соответственно и ни о каких зависимостях уже говорить не приходится...
...
Рейтинг: 0 / 0
dependence table
    #35302342
Garrynja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В рамках задачи версионирования метаданных ПГ использую процедуру удаления хранимок, не имеющих зависимостей (не задействованных в функциональных индексах и т.п).
Собственно проверка на наличие зависимостей тривиальная:

Код: plaintext
NOT EXISTS(SELECT * FROM pg_depend WHERE refobjid=pg_proc.oid) 
...
Рейтинг: 0 / 0
dependence table
    #35302416
Garrynja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При создании же хранимок проверяются входные и выходные аргументы, нет ли среди них среди них композитных типов (таблиц или пользовательских композитов). Отсутствие соответствующих типов в БД
не позволяет создать процедуру.

Код: plaintext
1.
2.
3.
SELECT d.nspname,c.relname
FROM adm.pg_get_proc_args(proc_oid) a, pg_type b, pg_class c, pg_namespace d
WHERE b.typtype='c' AND b.oid=a.arg_oid 
AND c.relnamespace=d.oid AND c.oid=b.typrelid
...
Рейтинг: 0 / 0
dependence table
    #35302419
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GarrynjaВ рамках задачи версионирования метаданных ПГ использую процедуру удаления хранимок, не имеющих зависимостей (не задействованных в функциональных индексах и т.п).
Собственно проверка на наличие зависимостей тривиальная:

Код: plaintext
NOT EXISTS(SELECT * FROM pg_depend WHERE refobjid=pg_proc.oid) 
если взять крайний вариант, допустим удаляемая хранимка вызывается из хранимки на C - этот запрос найдёт такую связь ? или например тело запроса на выборку в хранимке генерируется на лету, в зависимости от её параметра, в этом случае Ваш запрос найдёт связь хранимки с заранее не известной таблицей (имя таблицы станет известно только в момент выполнения хранимки, в зависимости от её параметра) ?

имхо в обоих из этих случаях ответ - нет...
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / dependence table
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]