ALTER VIEW вставляет префикс базы данных только для одного представления - PullRequest
1 голос
/ 08 января 2020

Возникла странная проблема.

Я использую несколько просмотров БД в своем приложении. Все представления просто ссылаются на свои таблицы без префикса имени базы данных, например,

SELECT  `foo`, `bar`
FROM    `tablename`

Однако у меня есть одно представление, которое выглядит следующим образом:

SELECT  `foo`, `bar`
FROM    `database_name`.`table_name`

Это вызывает головные боли при выполнении Сравнение схем.

Я несколько раз редактировал представление, используя ALTER VIEW, но каждый раз, когда он повторно вставляет имя базы данных в качестве префикса. Я также удалил и воссоздал его с нуля, но результат тот же.

Хотя он делает это только для этого одного вида.

Я использую MySQL Workbench 6.3.10. Вот полное утверждение:

CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `root`@`localhost` 
    SQL SECURITY DEFINER
VIEW `reporting_base` AS
    SELECT 
        `b`.`creditor_id` AS `creditor_id`,
        `c`.`creditor_name` AS `creditor_name`,
        `c`.`group_name` AS `group_name`,
        `rd`.`base_date` AS `base_date`,
        `rd`.`year` AS `year`,
        `rd`.`period` AS `period`,
        `rd`.`week` AS `week`,
        `b`.`id` AS `branch_id`,
        `b`.`branch_name` AS `branch_name`,
        `b`.`area` AS `area`,
        `b`.`manager` AS `manager`,
        `s`.`id` AS `staff_id`,
        `s`.`type` AS `staff_type`,
        `s`.`full_name` AS `staff_name`
    FROM
        (((`database_name`.`reporting_dates` `rd`
        JOIN `database_name`.`branches` `b`)
        JOIN `database_name`.`creditors` `c` ON (((`c`.`id` = `b`.`creditor_id`)
            AND (`c`.`include_in_reports` = 1))))
        LEFT JOIN (SELECT 
            0 AS `id`,
                `database_name`.`creditors`.`id` AS `creditor_id`,
                'n/a' AS `type`,
                'n/a' AS `full_name`
        FROM
            `database_name`.`creditors` UNION SELECT 
            `database_name`.`staff`.`id` AS `id`,
                `database_name`.`staff`.`creditor_id` AS `creditor_id`,
                `database_name`.`staff`.`type` AS `type`,
                `database_name`.`staff`.`full_name` AS `full_name`
        FROM
            `database_name`.`staff`) `s` ON ((`s`.`creditor_id` = `c`.`id`)))
    WHERE
        (`rd`.`base_date` <= UTC_DATE())

1 Ответ

1 голос
/ 08 января 2020

Если во всем операторе создания представления есть неоднозначность ... он может добавить имя базы данных.

...from (((''table1' 'rd' 
join 'dbname'.'table2' 'b'...

само по себе достаточно для запуска 'dbname' в коде представления.

...