Корневая причина ошибки "Недопустимое имя объекта: dbo.etc"?
Я занимаюсь программированием на довольно большом проекте, который был запущен кем-то, кто теперь покинул компанию...
Я только что поддержал одну из баз данных компании, а затем снова подключил ее к нашему тестовому серверу. Это, похоже, работает нормально.
Затем я просматриваю обычную процедуру входа в систему, и эта часть также работает.
Однако, как только я доберусь до точки в программе, где ей нужно выполнить хранимую процедуру, я возвращаю сообщение об ошибке Invalid object name 'Informix.dbo.customer'
.
Запуск той же функции в исходной базе данных прекрасен и возвращает данные, которые я ожидаю увидеть.
Пояснения к подобным ошибкам, которые я нашел, похоже, относятся к схемам, но там, где ситуация становится немного странной. В исходной базе данных нет никаких схем; В папке "Безопасность" он имеет только папку "Пользователи", содержащую dbo, и папку "Роли", содержащую папку "Роли базы данных", с обычным файлом db_owner и т.д. И пустую папку с именем "Роли приложения".
Папка "Безопасность" в базе данных с резервным копированием и восстановлением полна всех видов дерьма. Три пользователя в дополнение к dbo, папке "Схемы", папке "Сертификаты", двум папкам с ключами шифрования... Я не могу удалить их.
Из моего ограниченного понимания системы входа в систему SQL пользователь, с которым я вхожу, как получает не-dbo-разрешения из этой коллекции случайного дерьма, и поэтому ему отказывают в доступе к частям базы данных, принадлежащей dbo.
Для моего собственного понимания, в чем суть проблемы, которая вызывает эти ошибки Invalid object name
? И для практических вопросов, что я могу сделать, чтобы исправить эту ситуацию и действительно ли программа, которую я использую для работы с тестовой базой, так же, как и на живом?
Ответы
Ответ 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