我用SQL脚本创建了一个数据库,这些脚本与SQLCMD一起运行,也与SSMS中的一些脚本一起运行。我在同一个SQL数据库用户下运行它们。
当我想用sqlsrv驱动程序在IIS上运行的PHP脚本删除索引时,我收到了3701错误(索引不存在或权限不足(。我确信索引是存在的。
我将我的SQL数据库用户包括在sysadmin、db_ddladmin和db_owner中。
根据SQL Server关于删除索引的文档,我尝试将ALTER权限授予数据库用户。我尝试了一些我在这个网站上读到的其他赠款,以便能够删除索引。这是我的代码:
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))
我要删除的索引在representant列上。我发现我没有对该特定列的ALTER权限。这是问题所在吗?如何使用SQL脚本做到这一点?
经过2-4天的测试和研究,我找到了解决方案。这个问题与权限无关。我应该发布用于删除索引的SQL查询:
DROP INDEX fki_minutes_clients_representant_fkey ON minutes_clients.representant
这就是问题所在。我的查询没有指向representant列上minutes_clients表的fki_minutes_clients_representant_fkey索引。因此,我得到的错误消息是正确的,但不明确:找不到索引(正确!(或您没有删除此索引的权限(错误!(。
以下是我应该用来删除索引的正确语法:
DROP INDEX minutes_clients.representant
或
DROP INDEX fki_minutes_clients_representant_fkey ON minutes_clients
希望它对有用