2015-09-13 2 views
0

Так я бегу утилиту SqlRestore, созданную AppHarbor, который можно найти здесь:Удаление записей из всех таблиц, что здесь не так?

https://github.com/appharbor/AppHarbor-SqlServerBulkCopy

Первый шаг утилиты стереть данные из базы данных назначения, используя следующие команды:

// http://stackoverflow.com/questions/155246/how-do-you-truncate-all-tables-in-a-database-using-tsql/156813#156813 
StringBuilder commandBuilder = new StringBuilder(); 
commandBuilder.Append(
    @" 
    -- disable all constraints 
    EXEC sp_msforeachtable ""ALTER TABLE ? NOCHECK CONSTRAINT all"" 

    -- delete data in all tables 
    EXEC sp_msforeachtable ""DELETE FROM ?"" 

    -- enable all constraints 
    exec sp_msforeachtable ""ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"" 
"); 

Когда я запускаю это (как с помощью программы, а также вручную с помощью Management Studio), удаления утверждение бросает ошибку говоря invalid column name schoolid

В первой, я понятия не имел, какая таблица была метание ошибки, поэтому я переписал удаления шаг курсора, как показано здесь:

declare tableCursor cursor local forward_only for 

    select [name] 
    from sys.objects 
    where [type] = 'U' 

    declare @tableName varchar(50) 

    open tableCursor 

    fetch next from tableCursor into @tableName 

    while (@@FETCH_STATUS = 0) begin 
     print 'trying to delete from ' + @tableName 
     exec('delete from ' + @tableName) 
     print 'deleted from ' + @tableName 

     fetch next from tableCursor into @tableName 
    end 

close tableCursor 
deallocate tableCursor 

Выполнение сценария так говорит мне, что это был «пытается удалить из таблицы X ", но когда я посмотрю на определение таблицы таблицы X, этот столбец НЕ СУЩЕСТВУЕТ (и никогда не имеет)!

Итак, я решил просто вручную удалить таблицу, а затем сравнить VS Sql Server Schema с тем, чтобы сгенерировать таблицу в моей целевой базе данных, поскольку она была как-то повреждена.

Как только он будет сгенерирован, я заново запустил этот скрипт удаления, И ЭТО ПРОДОЛЖАЕТ ОШИБКУ!

Вот определение таблицы:

CREATE TABLE [dbo].[TourneyPoolMatchResult] (
    [TourneyPoolMatchResultId]  INT   IDENTITY (1, 1) NOT NULL, 
    [TournamentTypeId]    INT   NOT NULL, 
    [WinningWrestlerId]    INT   NOT NULL, 
    [LosingWrestlerId]    INT   NOT NULL, 
    [WinType]      VARCHAR (5) NOT NULL, 
    [Score]       VARCHAR (20) NULL, 
    [BonusPoints]     DECIMAL (2, 1) NOT NULL, 
    [AdvancementPoints]    DECIMAL (2, 1) NOT NULL, 
    [PlacementPoints]    INT   NOT NULL, 
    [LosingWrestlerPlacementPoints] INT   NOT NULL, 
    PRIMARY KEY CLUSTERED ([TourneyPoolMatchResultId] ASC) 
); 


GO 
CREATE trigger [dbo].[trg_TourneyPoolMatchResult_Change] 
    on [dbo].[TourneyPoolMatchResult] 
    after insert, update, delete 
    as 

    exec [UpdateTeamPoints]; 
    exec [UpdatePointsForSubmittal]; 

Как вы можете видеть, нигде в том, что определение таблицы делает это что-нибудь о SchoolId.

Что происходит в мире?

+0

Вы используете инструкцию delete, и у вас есть триггеры при удалении. Возможно, ваша функция триггера (например, «UpdateTeamPoints» или «UpdatePointsForSubmittal») ссылается на столбец с именем schoolid? Найдите свой код sql, есть ли какой-нибудь «школьник»? –

+0

А, хорошо, позвольте мне проверить ... – ganders

+0

Да, это было, пожалуйста, добавьте в качестве ответа, чтобы я мог дать вам кредит. – ganders

ответ

2

Вы используете инструкцию delete, и у вас есть триггеры для удаления. Возможно, ваша функция триггера (например, UpdateTeamPoints или UpdatePointsForSubmittal) ссылается на столбец с именем schoolid? Пожалуйста, найдите свой код sql, есть ли какой-нибудь учебник в любом месте?

1

Если таблицы не Foreign Key ограничений вместо

DELETE FROM table_name;

использование:

TRUNCATE TABLE table_name;

От TRUNCATE:

Удаляет все строки из таблицы или указанная parti без регистрации отдельных удалений строк. TRUNCATE TABLE - , аналогичный инструкции DELETE без предложения WHERE; однако TRUNCATE TABLE быстрее и использует меньше системных и транзакционных журналов ресурсов.

и

TRUNCATE TABLE не может активировать триггер, так как операция делает не войти отдельные удалений строки. Для получения дополнительной информации см. CREATE TRIGGER (Transact-SQL).

Смежные вопросы