powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Неоднозначность полей в подзапросе
31 сообщений из 31, показаны все 2 страниц
Неоднозначность полей в подзапросе
    #39246839
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дано: в таблице "SYS$CONFIG$DATASET" есть поле ID_CREATOR и вычисляемое поле CREATION_INFO, определяемое следующим образом:
Код: sql
1.
(SELECT U.SURNAME_WITH_INITIALS FROM DIR$SECURITY$DB_USER U WHERE ID = ID_CREATOR)


Так вот, это поле возвращает неверное ФИО пользователя, так как в таблице DIR$SECURITY$DB_USER есть с таким же наименованием и Firebird берет значение этого поля оттуда, как наиболее ближайший контекст.
Вопросы:
1. Является ли это поведение абсолютно нормальным?
2. Не должно ли здесь по-хорошему происходить исключение Ambiguous field name?
Например, запрос
Код: sql
1.
SELECT U.SURNAME_WITH_INITIALS FROM SYS$CONFIG$DATASET D INNER JOIN DIR$SECURITY$DB_USER U ON U.ID = ID_CREATOR


возвращает ошибку, как и следовало ожидать:
Код: plaintext
1.
2.
3.
4.
5.
Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table SYS$CONFIG$DATASET and table DIR$SECURITY$DB_USER .
ID_CREATOR.
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39246951
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax,
Код: plsql
1.
2.
3.
SELECT U.SURNAME_WITH_INITIALS
  FROM SYS$CONFIG$DATASET D
    INNER JOIN DIR$SECURITY$DB_USER U ON U.ID = D.ID_CREATOR
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39246956
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax, сори, не сразу понял суть.
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39246958
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMaxНе должно ли здесь по-хорошему происходить исключение Ambiguous field name?
в первом запросе ты привел только одну таблицу. где там у тебя вторая - х.з.
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39246962
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

это он вычисляемое поле так определил
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39246984
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax, по хорошему, для таких целей разработчикам Firebird не мешало бы добавить для создаваемой таблицы псевдоним типа THIS, чтобы разработчик БД мог устранить неопределенность используя данный префикс. Ну и, ИМХО, SQLERROR = -204 в подобных случаях должна вылезать, так как действительно есть неопределенность.
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39246992
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

this в топку. Насчёт генерации ошибки согласен.
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247004
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисrdb_dev, this в топку.
Меня и SELF вполне устроит...
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247046
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

а, сегодня день невнимательности (не только у меня). Видимо, парсер в этом случае пропускает ambiguous.
И вообще, запросы в вычисляемых столбцах - зло.
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247053
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насколько помню, ambiguity ловится только для дубликатов имен на одном уровне вложенности. Для подзапросов и прочих вложенных структур имена резолвятся в приоритете текущего контекста, поэтому ошибки нет. Так было сделано специально, насколько я понимаю. Иначе совсем много всего отломится.
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247674
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

Вообще имеет ли смысл обсудить, действительно ли необходима данная фича?
Мое мнение - она отрицательна, так как приводит к тому, что результат вычисляемого поля может поменяться при добавлении такого же поля в таблицу подзапроса, плюс необходимо держать в голове, что у таблиц одинаковое поле и надо обязательно указать таблицу. На подобный случай наступал неоднократно, и каждый раз он вызывал непонимание что, собственно, происходит.
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247757
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax,

ИХМО подзапросы в вычисляемых полях это зло
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247793
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Вот вы заладили - зло, зло. Отличная вещь, которая значительно упрощает разработку.
Надо вывести в подсказке или в таблице информацию о создателе документа в программе в виде "Создано 01.06.2016, пользователь Иванов П.П.". Как, по-вашему, это правильно делать?
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247820
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax,
Код: plsql
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.
CREATE TABLE test1
(
    user_id INTEGER NOT NULL,
    user_name VARCHAR(60) CHARACTER SET utf8,
  CONSTRAINT test1__pk PRIMARY KEY (user_id)
);
COMMIT WORK;

INSERT INTO test1 (user_id, user_name) VALUES (1, 'Иванов П.П.');
COMMIT WORK;


SET TERM ^;
CREATE OR ALTER PROCEDURE user__get
  (
    user_id INTEGER
  )
  RETURNS
  (
    user_name VARCHAR(60) CHARACTER SET utf8
  )
AS
BEGIN
  SELECT user_name
    FROM test1
    WHERE user_id = :user_id
    INTO: user_name;
  SUSPEND;
END^
SET TERM ;^
COMMIT WORK;

CREATE TABLE test2
(
    doc_id    INTEGER NOT NULL,
    doc_name  VARCHAR(60) CHARACTER SET utf8,
    user_id   INTEGER NOT NULL,
    user_name COMPUTED BY ((SELECT user_name FROM user__get(user_id))),
  CONSTRAINT test2__pk PRIMARY KEY (doc_id),
  CONSTRAINT test2__fk__test1 FOREIGN KEY (user_id)
    REFERENCES test1 (user_id) ON UPDATE CASCADE ON DELETE SET NULL
);
COMMIT WORK;

INSERT INTO test2 (doc_id, doc_name, user_id) VALUES (1, 'Документ №1', 1);
COMMIT WORK;
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247827
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax,

1. запросом, так как в 90% случаев голая таблица неинтересна
2. если используется многократно, то сделать представление
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247842
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

Молодец. Вместо подзапроса с выборкой из таблицы, ты сделал то же самое, только с оверхедом в виде выборки из ХП (причем с синтаксисом до FB 2.5). Зачем такая сложность?
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247847
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В моем примере потенциальная ошибка с user_id INTEGER NOT NULL и ON DELETE SET NULL. Будьте бдительны! ;)
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247848
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис1. запросом, так как в 90% случаев голая таблица неинтересна
2. если используется многократно, то сделать представление
Зачем городить представление, если ровно то же самое (как логически, так и физически) будет с вычисляемым полем? А если мне эту таблицу обновлять надо, то создавать еще триггера на представление?
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247849
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax,

ты уже на тройку перешёл? Если да, то делай вычисляемое поле через PSQL функцию сразу все неоднозначности пропадут
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247850
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax, полагаешь, оверхед вьюшки будет намного меньше?
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247852
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисты уже на тройку перешёл? Если да, то делай вычисляемое поле через PSQL функцию сразу все неоднозначности пропадут
Зачем мне PSQL-функция, если можно подзапросом обойтись? А неоднозначность легко устраняется добавлением таблицы к именам полей в подзапросе.
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247854
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devCyberMax, полагаешь, оверхед вьюшки будет намного меньше?
Полагаю, оверхед в виде ХП, PSQL-функций, вьюшек и прочего нафиг не нужен, так как проблема не в составлении подзапроса, чтобы он формировал правильную выборку, а в том, что FB не считает данную ситуацию ошибкой.
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247862
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax, лично я предпочитаю работать с данными в таблицах через интерфейс селективных ХП, так как это позволяет более гибко работать с правами пользователей вплоть до прав на выборку и изменение отдельных записей (документов), так как ХП работает с правами создавшего её пользователя и в самой ХП можно определить алгоритм вычисления эффективных прав текущего (запустившего ХП) пользователя.
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247876
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devтак как ХП работает с правами создавшего её пользователя и в самой ХП можно определить алгоритм вычисления эффективных прав текущего (запустившего ХП) пользователя.

Это заблуждение. В Firebird ХП работает с правами вызывающего пользователя. Но самой ХП можно дать права на используемые объекты которые будут суммироваться с правами вызывающего пользователя. Возможность указания
AUTHID [DEFINER | CURRENT_USER]
была бы полезной. Ещё не поздно попросить чтобы сделали в Firebird 4.0. Всё равно там сейчас security сильно переделывается.
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247883
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev... так как ХП работает с правами создавшего её пользователя...
Похоже, тут меня подвело понимание прав в разрезе MS SQL Server. В FirebirdSQL это права доступа к таблицам из ХП, триггеров и представлений раздаются через GRANT ... TO <object_list>
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247886
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, да, одновременно отписались по этому поводу.
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39247930
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисЕщё не поздно попросить чтобы сделали в Firebird 4.0
это уже в планах, сейчас портируется из РедБазы (с некоторыми доработками)
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39251597
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
CREATE TABLE TEST1 (
    ID INTEGER,
    ID_FK INTEGER)



Скажите, а выполнение такого запроса тоже считается нормальным?
Код: sql
1.
2.
3.
4.
5.
6.
SELECT
    *
FROM
    TEST1 T
WHERE
    T.ID_FK = (SELECT ID_FK FROM RDB$DATABASE)



Напомню вопрос: может ли FB запретить использование поля без имени/альяса таблицы, если его нет в контексте текущего подзапроса?
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39251602
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMaxСкажите, а выполнение такого запроса тоже считается нормальным?
конечно

CyberMaxможет ли FB запретить использование поля без имени/альяса таблицы, если его нет в контексте текущего подзапроса?
можно, конечно, почитать стандарт на эту тему. Но думаю, что такой запрет очень много баз сломает.
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39251605
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

Так каждая новая версия FB ломает запросы в какой-то из областей, взять те же ключевые и зарезервированные слова, я уж не говорю про массовое исправление Ambiguous field name в 1.5. И тут аналогично, происходит стабилизация запроса, который не зависит от того, что в таблице подзапроса появится/исчезнет совпадающее поле и запрос станет возвращать вообще другой результат.
...
Рейтинг: 0 / 0
Неоднозначность полей в подзапросе
    #39251683
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
запросы со зведочкой тоже возвращают другую информацию после добавления столбца, давай их тоже запретим? :-) И разница с ambiguity тут существенна - неопределенный результат на текущий момент в текущей схеме или возможно некорректный результат когда-либо в будущем.

У меня сейчас нет под рукой оракла или мсскл, но SQLite/MySQL/PGSQL допускают такие запросы. Уверен, что и в стандарте запрета нет.
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Неоднозначность полей в подзапросе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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