Ссылка на одно и то же имя таблицы в разных схемах
Вопрос
У меня проблема с запросом Oracle в Windows-приложении на базе .net 2.0. Я использую System.Data.OracleClient
для подключения к базе данных Oracle. Имя базы данных: myDB
. Ниже строки подключения, которую я использую:
Data Source=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)
(HOST = 172.16.0.24)(PORT = 1522)))(CONNECT_DATA =(SERVICE_NAME = ORCL)));
User ID=myDB;Password=myDB;Unicode=True
Если я выполню приведенный ниже запрос, он даст мне неправильный результат (здесь неправильный результат означает неверные данные. Данные не принадлежат myDB):
SELECT ID, NAME
FROM MyTempTable
WHERE ID IN (10780, 10760, 11890)
Но если я добавлю имя базы данных вместе с ним, это даст правильный результат:
SELECT ID, NAME
FROM "myDB".MyTempTable
WHERE ID IN (10780, 10760, 11890)
Мое ограничение заключается в том, что я не могу добавить имя базы данных, так как это универсальное приложение и может работать с любой базой данных во время выполнения. Пожалуйста, помогите.
Решение
Это похоже на проблему с разрешением имен, попробуйте создать общий синоним для таблицы:
CREATE PUBLIC SYNONYM MyTempTable для MyTempTable ;
Кроме того, что именно вы подразумеваете под неправильным результатом , неверными данными, сообщением об ошибке?
<Ч>Изменить. Как называется схема, к которой относится требуемая таблица? Похоже, таблица, из которой вы пытаетесь выбрать, находится в другой схеме, чем та, которая принадлежит пользователю, к которому вы подключаетесь.
Другие советы
После подключения к базе данных проблема утра
ALTER SESSION SET CURRENT_SCHEMA=abc;
где abc - пользователь, которому принадлежат таблицы.
Для начала я бы предложил вам использовать провайдеров данных .net из Oracle - если это вообще возможно. Если вы начинаете в проекте, это будет лучший способ избавить себя от боли в дальнейшем. Вы можете получить их из здесь
Чтобы расширить сказанное stjohnroe, похоже, причина того, что вы получаете разные результаты, заключается в том, что в разных схемах существуют две разные таблицы с одинаковыми именами.
Добавив имя пользователя myDB в начало запроса, вы теперь получаете доступ к таблице с ожидаемыми данными. (Поскольку вы говорите, что данные не принадлежат «myDB», это, вероятно, означает, что приложение / proc, которое записывает данные, записывает и в неправильную таблицу).
Разрешение:
1. Если таблица действительно не относится к "myDB" затем опустите его для удобства (теперь при запуске кода вы можете получить 904 таблицы не найденных ошибок)
2. Создайте синоним к схеме и таблице, к которой вы действительно хотите получить доступ (например, CREATE SYNONYM myTable FOR aschema.myTable;)
3. Не забудьте предоставить права доступа из схемы, которой принадлежит таблица (например: GRANT SELECT, INSERT, DELETE ON myTable TO myDB; (здесь myDB относится к пользователю / схеме))
Попробуйте добавить
CONNECT_DATA=(SID=myDB)(SERVICE_NAME=ORCL)
в строке подключения.