2017-09-12 1 views
0

Ich habe eine SQL Azure-Datenbank und möchte ein Skript verwenden, um alle Spaltenspeicherindizes zu löschen.Fehler beim Löschen des Indexes in SQL Azure-Datenbank: Falsche Syntax in der Nähe des Schlüsselwortes 'ON' (Benutzerkontext = dbo)

Ich verbinde mich mit SSMS mit dem SQL Admin Login des SQL Server.

ich dieses Skript bin mit:

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; 

Ein Beispiel Aussage:

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

Wenn er gestartet wird, erzeugt dies Fehler:

Incorrect syntax near the keyword 'ON'.

Wenn ich versuche einfach:

DROP INDEX [dbo].[CCI_MyTable] 

Dies erzeugt Fehler:

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

In SSMS, kann ich der SQL Server-Administrator-Benutzer ist in der [Meister] Datenbank sehen, aber existiert nicht in der Datenbank, in der ich arbeite

Within. diese Datenbank, ich arbeite als ‚dbo‘:

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

Sollte nicht dbo Berechtigungen Indizes fallen zu lassen?

ASK:
Was ist der richtige Weg ist, um dies zu? Muss ich den Admin-Benutzer zu dieser Datenbank hinzufügen? Wenn dieser Benutzer existiert und ich mich mit SSMS verbinde, wäre user_name() dann dieser Benutzer und nicht dbo?

+1

entfernen dbo von [dbo] [CCI_MyTable] und Rest Skript halten, wie es – TheGameiswar

+0

Indizes Tabelle gebunden sind, Tabellen werden von Schemata unterschieden – TheGameiswar

+0

Es scheint. Wie vor dem INDEX Namen mit Dbo ist das Problem. Viele Beispiele im Internet verwenden diese Notation so nicht sicher, was mein Problem ist. – tbone

Antwort

1

Es scheint, dass das Problem den Indexnamen mit dem Schema vorausging (obwohl, ich schwöre, dass viele Beispiele, die ich gerade gelesen habe, genau das tun).

So ist die richtige Skript Syntax:

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; 
Verwandte Themen