2015-06-29 5 views
2

Работаю над Sybase ASE 15.5.Как присоединиться к таблицам в другой базе данных на одном сервере Sybase

У меня есть 2 базы данных, созданные на том же сервере, «DatabaseA» и «DatabaseB». Владелец базы данных - «Пользователь».

Вход в систему как «Пользователь» Я создал таблицу в «DatabaseB», называемую «TableA».

Теперь у моего пользователя есть доступ к обеим базам данных, но база данных по умолчанию - «DatabaseA».

Это успешен, когда я войти в DatabaseA:

USE DatabaseB 
GO 
SELECT * from DatabaseB.User.TableA 
GO 

Но это не так:

USE DatabaseA 
GO 
SELECT * from DatabaseB.User.TableA 
GO 

Он говорит мне, что есть «Нет такого объекта или пользователь не существует в базе данных».

У меня есть Googled, и большинство сайтов говорят, что если у пользователя есть права, вам нужно только добавить базу данных и имя владельца в таблицу для доступа к ней. Но это не похоже на мое дело.

Я попытался создать нон пользователя DBO «user2», и присвоение его выбора права использования

GRANT SELECT ON DatabaseB.User.TableA to User2 

и sp_helprotect показывает, что права есть для этого пользователя. Но результаты точно такие же, как когда я запрашиваю его с User.

Ниже результат от sp_helprotect

grantor | grantee | type | action | object | column | grantable 
'User' | 'User2' | 'Grant' | 'Select' | 'TableA' | 'All' | 'FALSE' 

Есть ли что-либо настройки или настройки, которые необходимо проверить, чтобы включить это?

EDIT (22 июля 2015)

Просто обнаружил кое-что. Есть несколько таблиц с DatabaseB, которые я могу получить из DatabaseA, но не всех таблиц.

Например, есть TableA, TableB, TableC и TableD в DatabaseB. Из которых TableB и TableD могут быть запрошены из DatabaseA с использованием

USE DatabaseA 
GO 
SELECT * from DatabaseB.User.TableB 
GO 
SELECT * from DatabaseB.User.TableD 
GO 

, который является успешным. И

USE DatabaseA 
GO 
SELECT * from DatabaseB.User.TableA 
GO 
SELECT * from DatabaseB.User.TableC 
GO 

не работает.

Помощь !!!

+0

Средняя часть является * «схемы» *, а не * «пользователь» * - это Sybase создать схема-для каждого пользователя? Потому что если нет, то эта схема может не существовать. Обычно стандартная схема называется «dbo» или «public» или аналогичной. – user2864740

+0

Если я вхожу в систему непосредственно в DatabaseB и запускаю тот же SQL, он работает. Он просто не работает, когда я вхожу в DatabaseA и пытаюсь запросить таблицу оттуда. Обе базы данных находятся на одном сервере, и у пользователя есть права доступа к ним. – iWantSimpleLife

+2

«Схема» не является терминологией ASE (это терминология MS SQL Server). Эта средняя часть - это имя пользователя базы данных, иначе. владелец объекта. – RobV

ответ

1

попробовать SELECT * from DatabaseB..TableA, чтобы получить результат из другой базы данных

также вы можете сделать ниже

use DatabaseB 
SELECT * from TableA 

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

еще один пример: Еще один пример:

select tabA.*,tabC.* from DatabaseB..TableA tabA, DatabaseA..TableC tabC 
where tabA.xxx = tabC.xxx 
+0

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

+0

Вам не нужно использовать полное имя. просто использовать '..' как мой первый пример еще один пример:.. ' выберите Таб *, tabC * от DatabaseB..TableA Таба, DatabaseA..TableC tabC где tabA.xxx = tabC.xxx' – barun

+0

Только что проверили с помощью '..'. Результат все еще не работает. Есть ли что-то, что мне нужно настроить на сервере, чтобы разрешить выбор кросс-базы? – iWantSimpleLife

0

Логин сервер ASE, кажется, «Пользователь» - это Войти это то, что нужно пароль. Это не то же самое, что и пользователь базы данных внутри базы данных. Это сопоставление устанавливается с помощью «sp_adduser».

Для решения проблемы вам нужно выяснить, какой пользователь БД вы есть. Выполните следующие действия:

use DatabaseA 
go 
select user_name() user_in_A, suser_name() login_name 
go 

use DatabaseB 
go 
select user_name() user_in_B, suser_name() login_name 
go 

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

+0

В этом случае все возвращаемые значения являются« Пользователь ». – iWantSimpleLife

+0

Фактически это не действует al user name, которое я использую в своем производстве, это его дезинфицированная версия, но результаты все те же, что и имя пользователя, с которым я вошел. – iWantSimpleLife

+0

В этом случае это означает, что у вас есть логин сервера под названием «Пользователь», который сопоставляется с пользователем БД, также называемым «Пользователь» в каждой базе данных (последние два являются независимыми). Теперь, если вы создадите таблицу «Mytab», технически будет «User.Mytab» - запустить «sp_help» User.Mytab »для проверки (все чувствительные к регистру!). Вы сами можете получить доступ к таблице либо как «User.Mytab» или как «Mytab». Другие пользователи должны указать «User.Mytab» (но им также должны быть предоставлены права доступа). Если вы ссылаетесь на «dbo.Mytab», это совершенно другая таблица, владелец пользователя, которому принадлежит база данных («dbo»). – RobV

-1

Наличие логина и пользователя, отозванного «ПОЛЬЗОВАТЕЛЬ», не является хорошей идеей, так как это также имя системной функции, которая возвращает имя текущего пользователя. Можете ли вы попробовать один и тот же запрос с использованием другого пользователя (например, «bob»)?

Возможно, вам необходимо предоставить соответствующие разрешения для bob, но, по крайней мере, не будет никакой путаницы в именах пользователей.

Это еще к комментариям RobV в (я не хватает респ добавлять комментарии, хотя!)

+0

Фактический пользователь не используется «Пользователь». Из соображений безопасности я переименовал базу данных, таблицы и имена пользователей. Вы видите, что это санированная версия фактического запроса. – iWantSimpleLife

+0

Можете ли вы применить разрешения к таблице с помощью ролей? Это будет установлено на уровне сервера и будет гарантировать, что оно будет одинаковым в обеих базах данных. – John

+0

Я пробовал права пользователя или роли. Оба не работают. Кроме того, пользователь является владельцем базы данных как базы данных, так и всех таблиц в обеих базах данных. Я могу переключаться между базой данных и запрашивать все таблицы. Я просто не могу переселить запросы из других таблиц. – iWantSimpleLife

 Смежные вопросы

  • Нет связанных вопросов^_^