SQL Server 2005 - SQL оператор за премахване на клъстерирани ключове от таблици въз основа на заявка за имена на таблици?

Опитвам се да възстановя резервно копие на база данни на Microsoft Dynamics NAV, което за съжаление се проваля, тъй като се опитва да зададе КЛУСТЕРЕН КЛЮЧ за таблиците, които вече имат клъстерирани ключове.

В NAV всяка компания в базата данни получава собствено копие на таблиците, с префикс името на компанията, напр. COMPANY$User_Setup. Затова бих искал да премахна всеки клъстериран ключ на дадена компания, което означава на всяка таблица, чието име започва с „Company$“.

Някой има ли SQL оператор, който може да извърши това?


person Martin C.    schedule 03.08.2009    source източник


Отговори (1)


Ще трябва да го направите като курсор. Ако приемем, че всяко PK ограничение е наименувано последователно и се основава на името на таблицата, бихте могли да направите нещо като (нетествано, така че може да съдържа правописни грешки или неясни синтактични грешки):

DECLARE mycursor CURSOR FOR SELECT name FROM sysobjects WHERE name LIKE 'Company$%'

OPEN CURSOR
FETCH NEXT FROM mycursor INTO @tablename
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sql = N'ALTER TABLE QUOTENAME(' + @tablename + ') DROP CONSTRAINT PK_' + @tablename 
    EXEC sp_ExecuteSQL @sql
    FETCH NEXT FROM mycursor INTO @tablename
END

CLOSE CURSOR
DEALLOCATE CURSOR

Ако вашите PK не са наименувани въз основа на име на таблица, тогава ще трябва да промените това, за да правите заявки и на базата на sysconstraints или sysindexes, за да получите действителното име на PK.

person Chris J    schedule 03.08.2009
comment
Това няма да го направи - вие просто премахвате ограничението за първичен ключ - това все още не изпуска индекса. Освен това, докато първичният ключ обикновено е клъстерният индекс по подразбиране, това не е изискване - може да са два различни индекса. И още повече: първичният ключ (ако това е и клъстерираният индекс) обикновено също се препраща от връзки на външен ключ - така че и те трябва да бъдат премахнати, преди да можете да премахнете индекса на първичния ключ. - person marc_s; 03.08.2009
comment
Обикновено премахването на PK ограничението също ще премахне свързания индекс. Признавам обаче, че правя някои предположения, за да го опростя ... но за да илюстрирам основата на решението, то предоставя отправна точка. - person Chris J; 03.08.2009
comment
Благодаря, знаех, че ще изпусна първичния ключ. Всъщност, просто бих нулирал CLUSTERED на HEAP в индекса. Възможно ли е това по някакъв начин? - person Martin C.; 03.08.2009
comment

Бих предложил най-добрият залог е просто да „опитате“. Таксите за стартиране на малък екземпляр не са високи и скоростта на трансфер на данни е много ниска - преместих доста GB и таксите ми за данни все още са по-малко от долар(!) през първия ми месец. Вероятно в крайна сметка ще плащате най-вече за системно време, а не за данни, подозирам.

Все още не съм внедрил, но стартирах екземпляр, мигрирах го от Ubuntu 8.04 на 8.10, опитах различни настройки за сигурност на порта, видях какви опити за достъп са опитвали неизвестни хора (най-вече търсейки phpadmin), изпълних някои тестове срещу него и като цяло експериментирах с конфигурацията и рестартирането на компонентите, които внедрявам. Това беше добра прелюдия към крайното ми разполагане. Няма да започна с голяма база данни, така че първоначално ще се придържам към стандартното пространство на инстанция EC2.

Единственият негатив, който чух, е, че някои спамъри са направили някои от диапазоните на IP адреси предмет на блокиране на спам - но все още не са потвърдили това.

- person Chris J; 04.08.2009