2017-09-12 1 views
0

J'ai une base de données dans SQL Azure et je souhaite utiliser un script pour supprimer tous les index de la bibliothèque de colonnes.Erreur lors de la suppression de l'index sur la base de données SQL Azure: Syntaxe incorrecte près du mot clé 'ON' (contexte utilisateur = dbo)

Je me connecte à l'aide de SSMS à l'aide du login administrateur SQL du serveur SQL.

J'utilise ce script:

declare @sql nvarchar(max); 
set @sql = N''; 
select @sql = @sql + N'DROP INDEX ' + OBJECT_SCHEMA_NAME(i.OBJECT_ID) + '.' + i.name + N' ON ' + OBJECT_SCHEMA_NAME(i.OBJECT_ID) + '.' + o.name + '; 
' 
FROM sys.indexes AS i INNER JOIN sys.tables AS o ON i.[object_id] = o.[object_id] 
where i.name is not null and o.name is not null and i.type_desc like '%COLUMN%' 
PRINT @sql; 
EXEC sp_executesql @sql; 

Un exemple déclaration:

DROP INDEX [dbo].[CCI_MyTable] ON [dbo].[MyTable]; 

Lorsqu'il est exécuté, cela génère une erreur:

Incorrect syntax near the keyword 'ON'.

Si j'essaie simplement:

DROP INDEX [dbo].[CCI_MyTable] 

Cela génère une erreur:

Cannot drop the index 'dbo.CCI_MyTable', because it does not exist or you do not have permission.**

Dans SSMS, je peux voir la base de données SQL SERVER utilisateur admin existe dans le [maître], mais n'existe pas dans la base, je travaille dans

Within. cette base de données, je suis en cours d'exécution comme « dbo »:

SELECT USER_NAME()  -- DBO 
SELECT CURRENT_USER; -- DBO 

ne doit pas dbo avoir des autorisations pour supprimer des index?

DEMANDER:
Quelle est la bonne façon d'aller à ce sujet? Ai-je besoin d'ajouter l'utilisateur admin à cette base de données? Si cet utilisateur existait et que je me connectais avec SSMS, user_name() serait-il cet utilisateur plutôt que dbo?

+1

supprimer dbo de [dbo] [CCI_MyTable] et garder reste du script tel qu'il est – TheGameiswar

+0

index sont liés à la table, les tables sont différenciées par des schémas – TheGameiswar

+0

Il semble. comme précédant le nom INDEX avec dbo est le problème. De nombreux exemples sur Internet utilisent cette notation, donc je ne sais pas quel est mon problème. – tbone

Répondre

1

Il semble que le problème précédait le nom de l'index avec le schéma (bien que, je le jure, de nombreux exemples que j'ai lus le fassent).

Donc, la syntaxe de script correct est:

declare @sql nvarchar(max); 
set @sql = N''; 
select @sql = @sql + N'DROP INDEX ' + i.name + N' ON ' + OBJECT_SCHEMA_NAME(i.OBJECT_ID) + '.' + o.name + '; 
' 
FROM sys.indexes AS i INNER JOIN sys.tables AS o ON i.[object_id] = o.[object_id] 
where i.name is not null and o.name is not null and i.type_desc like '%COLUMN%' 
PRINT @sql; 
EXEC sp_executesql @sql;