Я создал базу данных из сценариев SQL, которые я запускал с SQLCMD, а также с некоторыми сценариями в SSMS. Я запускал их под тем же пользователем базы данных SQL.
Когда я хочу удалить индекс с помощью PHP-скрипта, работающего на IIS с драйвером sqlsrv, я получил ошибку 3701 (индекс не существует или недостаточно прав). Я уверен, что индекс существует.
Я включил своего пользователя базы данных SQL в sysadmin, db_ddladmin, db_owner.
Я пытался предоставить разрешение ALTER пользователю моей базы данных в соответствии с документацией SQL Server об удалении индекса. Я попробовал другой грант, который я прочитал на этом сайте, чтобы включить удаление индекса. Вот мой код:
GRANT CONTROL ON dbo.minutes_clients TO admin_igreffe
GRANT ALTER (representant) ON dbo.minutes_clients TO admin_igreffe
GRANT CREATE TABLE TO admin_igreffe
GRANT ALTER ON SCHEMA :: dbo TO admin_igreffe
Ничего, чтобы помочь мне. Я проверил разрешение на моем столе с:
SELECT * FROM fn_my_permissions('dbo.minutes_clients', 'OBJECT')
Я получил следующий результат:
entity_name subentity_name permission_name
----------------------- ----------------------------------- ----------------
dbo.minutes_clients SELECT
dbo.minutes_clients UPDATE
dbo.minutes_clients REFERENCES
dbo.minutes_clients INSERT
dbo.minutes_clients DELETE
dbo.minutes_clients EXECUTE
dbo.minutes_clients RECEIVE
dbo.minutes_clients VIEW CHANGE TRACKING
dbo.minutes_clients VIEW DEFINITION
dbo.minutes_clients ALTER
dbo.minutes_clients TAKE OWNERSHIP
dbo.minutes_clients CONTROL
dbo.minutes_clients id_minute SELECT
dbo.minutes_clients id_client SELECT
dbo.minutes_clients representant SELECT
dbo.minutes_clients id_minute UPDATE
dbo.minutes_clients id_client UPDATE
dbo.minutes_clients representant UPDATE
dbo.minutes_clients id_minute REFERENCES
dbo.minutes_clients id_client REFERENCES
dbo.minutes_clients representant REFERENCES
(21 affected row(s))
Индекс, который я хочу удалить, находится в столбце представителя. Я вижу, что у меня нет разрешения ALTER на этот конкретный столбец. Это проблема? Как я могу сделать это с помощью сценария SQL?
Я нашел решение после 2-4 дней испытаний и исследований. Проблема не имеет ничего общего с разрешением. Я должен опубликовать SQL-запрос, который я использовал для удаления моего индекса:
DROP INDEX fki_minutes_clients_representant_fkey ON minutes_clients.representant
Это проблема. Мой запрос не указывает на индекс fki_minutes_clients_represenant_fkey в таблице minutes_clients столбца-представителя. Таким образом, сообщение об ошибке, которое я получил, было правильным, но неоднозначным: не удается найти индекс (правильно!) Или у вас нет разрешения удалить этот индекс (неправильно!).
Вот правильный синтаксис, который я должен использовать, чтобы отбросить мой индекс:
DROP INDEX minutes_clients.representant
или же
DROP INDEX fki_minutes_clients_representant_fkey ON minutes_clients
Надеюсь, это будет полезно для кого-то
Других решений пока нет …