Как включить кросс-базы данных в MySQL?
Я пытаюсь перенести некоторые данные из моей производственной базы данных в свою песочницу, используя такой запрос:
INSERT `dbsandbox`.`SomeTable`(Field1, Field2, Field3)
SELECT t.Field1, t.Field2, t.Field3
FROM `dbprod`.`SomeTable` t;
Когда я пытаюсь это соединение между базами данных, я получаю следующую ошибку:
ОШИБКА 1142 (42000): команда SELECT запрещена пользователю 'myusername'@'server.domain.tdl' для таблицы 'SomeTable'
У данного пользователя есть права доступа к рассматриваемым таблицам для обеих баз данных. Я пробовал это и в клиенте Unix MySQL, и в приложении Windows MySQL Query Browser с тем же результатом.
Что мне не хватает?
2 ответа
Оказывается, это была проблема с разрешениями. Исходной базе данных требовался пароль для имени пользователя, которое я использовал для доступа к любым таблицам. Цель требовала, чтобы имя пользователя находилось только на локальном хосте.
Несмотря на то, что я запускаю клиент MySQL, используя пароль каждый раз в контексте запроса к базе данных, выполняется другое подключение. Это соединение не помнит, что я изначально проходил аутентификацию на клиенте с паролем, поэтому не удалось подключиться из песочницы к производственной базе данных. Очевидно, что явное указание имени базы данных для таблицы иногда подразумевает необходимость и другого соединения.
Ответ состоял в том, чтобы инициировать запрос из производственной базы данных, обратиться к локальным таблицам без спецификатора базы данных, а затем вставить их в таблицы базы данных песочницы. На этот раз это сработало:
ИСПОЛЬЗОВАТЬ dbprod
ВСТАВИТЬ dbsandbox
,SomeTable
(Поле 1, Поле 2, Поле 3) ВЫБЕРИТЕ t.Field1, t.Field2, t.Field3
FROM SomeTable
т;
Это звучит как проблема с разрешениями. Часто пользовательские разрешения устанавливаются для базы данных в виде базы данных, поэтому у пользователя для получателя нет доступа к источнику.
Сначала убедитесь, что вы можете сделать выбор из исходной базы данных.
SELECT t.Field1, t.Field2, t.Field3
FROM `dbprod`.`SomeTable` t;
Это работает? Если нет, то вам нужно предоставить пользователю право выбора на исходной базе данных.
Обе базы данных находятся на / в одном сервере, верно?