Ссылка на одно и то же имя таблицы в разных схемах

StackOverflow https://stackoverflow.com/questions/38014

  •  09-06-2019
  •  | 
  •  

Вопрос

У меня проблема с запросом 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)

в строке подключения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top