Не удается найти объект, поскольку он не существует или у вас нет прав. Ошибка в SQL Server

У меня есть база данных и сценарий Sql для добавления некоторых полей в таблицу под названием "Продукты" в базе данных.

Но когда я выполняю этот скрипт, я получаю следующую ошибку:

Cannot find the object "Products" because it does not exist or you do not have permissions

Почему происходит ошибка и что я должен сделать для ее устранения?

Ответ 1

Вы уверены, что выполняете script по отношению к правильной базе данных? В студии SQL Server Management вы можете изменить базу данных, в которой выполняется запрос, в раскрывающемся списке на одной из панелей инструментов, или вы можете начать свой запрос с помощью этого:

USE SomeDatabase

Ответ 2

Я нашел причину, почему это произойдет. У пользователя были соответствующие разрешения, но хранимая процедура включала инструкцию TRUNCATE:

TRUNCATE TableName

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

DELETE FROM TableName

... и ошибка ушла!

Ответ 3

Выполняет ли пользователь этот script даже видеть эту таблицу?

select top 1 * from products

Получаете ли вы какой-либо результат для этого?

Если да: имеет ли этот пользователь разрешение на изменение таблицы, то есть выполнение сценариев DDL, таких как ALTER TABLE и т.д.? Обычно обычные пользователи не имеют таких повышенных разрешений.

Ответ 4

Это также может произойти из-за опечатки в ссылке на таблицу, например [dbo.Product] вместо [dbo].[Product].

Ответ 5

Возможно также, что вы создали "Продукты" в своей схеме входа, и вы пытались выполнить их в другой схеме (возможно, dbo)

Шаги по устранению этой проблемы

1) откройте студию управления 2) Найдите объект в проводнике и определите схему, под которой находится ваш объект? (это текст перед именем вашего объекта). На изображении ниже его "dbo" и мое имя объекта - это статус действия

выделенная часть - имя схемы

если вы видите это как "yourcompanydoamin\yourloginid", тогда вы должны вы можете изменить разрешение на эту конкретную схему, а не любую другую схему.

вы можете обратиться к "Разделение прав собственности и разделов пользователей в SQL Server"

Ответ 6

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

Или до script это будет:

GRANT EXECUTE ON OBJECT::dbo.[PROCNAME]
    TO [ServerInstance\user];

GRANT ALTER ON OBJECT::dbo.[PROCNAME]
    TO [ServerInstance\user];

Ответ 7

Я пытаюсь скопировать таблицу из PROD в DEV, но получить ошибку: "Не удается найти объект X, потому что он не существует или у вас нет разрешений".

Однако таблица действительно существует, и я работал как sa, поэтому у меня были разрешения.

Проблема была на самом деле с ПРОТИВОПОКАЗАНИЯМИ. Я переименовал таблицу на DEV в old_XXX несколько месяцев назад. Но когда я попытался скопировать оригинал из PROD, имена Defaut Constraint столкнулись.

Сообщение об ошибке вводит в заблуждение

Ответ 8

В моем случае я работал под другим пользователем, чем тот, которого я ожидал.

У меня была 'DRIVER={SQL Server};SERVER=...;DATABASE=...;Trusted_Connection=false;User Id=XXX;Password=YYY' в качестве строки подключения, которую я передал в pypyodbc.connect(), но соединение все еще использовало учетные данные пользователя Windows, который запускал script (я проверил это с помощью SQL Server Profiler и попробовал недействительная комбинация uid/password, которая не привела к ожидаемой ошибке).

Я решил не копаться в этом дальше, так как переход на этот лучший способ подключения исправил проблему:

conn = pypyodbc.connect(driver='{SQL Server}', server='servername', database='dbname', uid='userName', pwd='Password')

Ответ 9

Делюсь своим делом, надеюсь, это поможет.

В моей ситуации внутри MY_PROJ.Database->MY_PROJ.Database.sqlproj мне пришлось поместить это:

<Build Include="dbo\Tables\MyTableGeneratingScript.sql" />

Ответ 10

Это может привести к разрешению проблемы. Пользователю необходимо как минимум разрешение ALTER для усечения таблицы. Другим вариантом является вызов DELETE FROM вместо TRUNCATE TABLE, но эта операция медленнее, потому что она записывает в файл журнала, тогда как TRUNCATE не записывает в файл журнала.

Минимальное требуемое разрешение - ALTER для table_name. Разрешения TRUNCATE TABLE по умолчанию принадлежат владельцу таблицы, членам предопределенной роли сервера sysadmin, а также предопределенным ролям базы данных db_owner и db_ddladmin и не подлежат передаче. Однако вы можете включить оператор TRUNCATE TABLE в модуль, такой как хранимая процедура, и предоставить соответствующие разрешения модулю с помощью предложения EXECUTE AS.