Ссылка на одно и то же имя таблицы в разных схемах - PullRequest
3 голосов
/ 01 сентября 2008

У меня проблема с запросом Oracle в приложении Windows на базе .net 2.0. Я использую System.Data.OracleClient для подключения к базе данных оракула. Имя базы данных 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)

Мое ограничение заключается в том, что я не могу добавить имя базы данных, поскольку это универсальное приложение и может работать с любой базой данных во время выполнения. Пожалуйста, помогите.

Ответы [ 5 ]

2 голосов
/ 05 июня 2011

При подключении к базе данных проблема утра

ALTER SESSION SET CURRENT_SCHEMA=abc;

где abc - пользователь, которому принадлежат таблицы.

2 голосов
/ 01 сентября 2008

Это похоже на проблему с разрешением имен, попробуйте создать общедоступный синоним в таблице:

CREATE PUBLIC SYNONYM MyTempTable для MyTempTable ;

Кроме того, что именно вы подразумеваете под неверный результат , неверные данные, сообщение об ошибке?


Редактировать: Как называется схема, к которой относится требуемая таблица? Похоже, таблица, из которой вы пытаетесь выбрать, находится в другой схеме, чем та, которая принадлежит пользователю, к которому вы подключаетесь.

1 голос
/ 02 сентября 2008

Чтобы расширить сказанное stjohnroe, похоже, причина того, что вы получаете разные результаты, заключается в том, что в разных схемах существуют две разные таблицы с одинаковыми именами.
Добавив имя пользователя myDB в начало запроса, вы теперь получаете доступ к таблице с ожидаемыми данными. (Поскольку вы говорите, что данные не принадлежат myDB, это, вероятно, означает, что app / proc, который записывает данные, также записывает данные в неправильную таблицу).
Разрешение:
1. Если таблица на самом деле не принадлежит myDB, то отбросьте ее для удобства (теперь вы можете получить 904 таблицы не найденных ошибок при запуске вашего кода)
2. Создайте синоним к схеме и таблице, к которой вы действительно хотите получить доступ (например, CREATE SYNONYM myTable FOR aschema.myTable;)
3. Не забудьте предоставить права доступа из схемы, которой принадлежит таблица (например: GRANT SELECT, INSERT, DELETE ON myTable TO myDB; (здесь myDB относится к пользователю / схеме))

1 голос
/ 01 сентября 2008

Для начала я бы посоветовал вам использовать поставщиков данных .net из Oracle - если это вообще возможно. Если вы начинаете в проекте, это будет лучший способ избавить себя от боли в дальнейшем. Вы можете получить их от здесь

0 голосов
/ 01 сентября 2008

Попробуйте добавить

CONNECT_DATA=(SID=myDB)(SERVICE_NAME=ORCL)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...