Подтвердить что ты не робот

Корневая причина ошибки "Недопустимое имя объекта: dbo.etc"?

Я занимаюсь программированием на довольно большом проекте, который был запущен кем-то, кто теперь покинул компанию...

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

Затем я просматриваю обычную процедуру входа в систему, и эта часть также работает.

Однако, как только я доберусь до точки в программе, где ей нужно выполнить хранимую процедуру, я возвращаю сообщение об ошибке Invalid object name 'Informix.dbo.customer'.

Запуск той же функции в исходной базе данных прекрасен и возвращает данные, которые я ожидаю увидеть.

Пояснения к подобным ошибкам, которые я нашел, похоже, относятся к схемам, но там, где ситуация становится немного странной. В исходной базе данных нет никаких схем; В папке "Безопасность" он имеет только папку "Пользователи", содержащую dbo, и папку "Роли", содержащую папку "Роли базы данных", с обычным файлом db_owner и т.д. И пустую папку с именем "Роли приложения".

Папка "Безопасность" в базе данных с резервным копированием и восстановлением полна всех видов дерьма. Три пользователя в дополнение к dbo, папке "Схемы", папке "Сертификаты", двум папкам с ключами шифрования... Я не могу удалить их.

Из моего ограниченного понимания системы входа в систему SQL пользователь, с которым я вхожу, как получает не-dbo-разрешения из этой коллекции случайного дерьма, и поэтому ему отказывают в доступе к частям базы данных, принадлежащей dbo.

Для моего собственного понимания, в чем суть проблемы, которая вызывает эти ошибки Invalid object name? И для практических вопросов, что я могу сделать, чтобы исправить эту ситуацию и действительно ли программа, которую я использую для работы с тестовой базой, так же, как и на живом?

4b9b3361

Ответ 1

Если я правильно понял, вы выполняете процедуру (SomeProc) в базе данных (SomeDB) и выдаете ошибку Invalid object name 'Informix.dbo.customer'? Это просто означает, что SomeProc не может найти объект под названием "клиент" в схеме под названием "dbo" в базе данных под названием "Informix". Для этого есть несколько возможных причин:

  • Объект не существует, возможно, потому, что схемы и/или базы данных не существует
  • Объект существует, но пользователь, выполняющий эту процедуру, не имеет разрешения даже видеть его
  • Объект существует, но база данных чувствительна к регистру, и некоторая часть имени не совпадает с именем в коде

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

Наконец, при размещении вопросов всегда указывайте версию SQL Server (2000/2005/2008) и версию (Express, Standard, Enterprise); они могут быть очень важными, когда речь идет о схемах и разрешениях, поскольку функции и поведение могут быть разными.

Ответ 2

Это может быть проблема с владельцем объекта (SP в вашем случае). Проверьте владельца в студии управления SQL