Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Неоднозначность полей в подзапросе / 25 сообщений из 31, страница 1 из 2
31.05.2016, 10:45
    #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
31.05.2016, 11:50
    #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
31.05.2016, 11:52
    #39246956
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неоднозначность полей в подзапросе
CyberMax, сори, не сразу понял суть.
...
Рейтинг: 0 / 0
31.05.2016, 11:53
    #39246958
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неоднозначность полей в подзапросе
CyberMaxНе должно ли здесь по-хорошему происходить исключение Ambiguous field name?
в первом запросе ты привел только одну таблицу. где там у тебя вторая - х.з.
...
Рейтинг: 0 / 0
31.05.2016, 11:55
    #39246962
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неоднозначность полей в подзапросе
kdv,

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

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

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

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

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

Вот вы заладили - зло, зло. Отличная вещь, которая значительно упрощает разработку.
Надо вывести в подсказке или в таблице информацию о создателе документа в программе в виде "Создано 01.06.2016, пользователь Иванов П.П.". Как, по-вашему, это правильно делать?
...
Рейтинг: 0 / 0
01.06.2016, 10:16
    #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
01.06.2016, 10:23
    #39247827
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неоднозначность полей в подзапросе
CyberMax,

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

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

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

Это заблуждение. В Firebird ХП работает с правами вызывающего пользователя. Но самой ХП можно дать права на используемые объекты которые будут суммироваться с правами вызывающего пользователя. Возможность указания
AUTHID [DEFINER | CURRENT_USER]
была бы полезной. Ещё не поздно попросить чтобы сделали в Firebird 4.0. Всё равно там сейчас security сильно переделывается.
...
Рейтинг: 0 / 0
01.06.2016, 11:07
    #39247883
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неоднозначность полей в подзапросе
rdb_dev... так как ХП работает с правами создавшего её пользователя...
Похоже, тут меня подвело понимание прав в разрезе MS SQL Server. В FirebirdSQL это права доступа к таблицам из ХП, триггеров и представлений раздаются через GRANT ... TO <object_list>
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Неоднозначность полей в подзапросе / 25 сообщений из 31, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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