Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Можно ли отменить TRUNCATE TABLE  [new]
renaton
Member

Откуда:
Сообщений: 753
День добрый!
Немного ламерский вопрос:
Можно ли отменить результат выполнения инструкции TRUNCATE TABLE? Производилась без транзакции :( Спасибо.
З.Ы. Размер файла данных mdf остался прежним...может еще не все потеряно?
31 май 11, 09:23    [10736435]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли отменить TRUNCATE TABLE  [new]
Kirillich
Member

Откуда:
Сообщений: 581
renaton,

конечно можно, если у вас есть бэкапы
31 май 11, 09:27    [10736451]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли отменить TRUNCATE TABLE  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
TRUNCATE TABLE (Transact-SQL)
Замечания
По сравнению с инструкцией DELETE, инструкция TRUNCATE TABLE обладает следующими преимуществами:

  • Используется меньший объем журнала транзакций.

    Инструкция DELETE производит удаление по одной строке, и заносит в журнал транзакций запись для каждой удаляемой строки. Инструкция TRUNCATE TABLE удаляет данные, освобождая страницы данных, используемые для хранения данных таблиц, и в журнал транзакций записывает только данные об освобождении страниц.

  • Обычно используется меньшее количество блокировок.

    Если инструкция DELETE выполняется с блокировкой строк, для удаления блокируется каждая строка таблицы. Инструкция TRUNCATE TABLE всегда блокирует таблицу и страницу, но не каждую строку.

  • В таблице остается нулевое количество страниц, без исключений.

    После выполнения инструкции DELETE в таблице могут все еще оставаться пустые страницы. Например, чтобы освободить пустые страницы в куче, необходима, как минимум, монопольная блокировка таблицы (LCK_M_X). Если операция удаления не использует блокировку таблицы, таблица (куча) будет содержать множество пустых страниц. Для индексов после операции удаления могут остаться пустые страницы, хотя эти страницы и будут быстро освобождены в процессе фоновой очистки.
  • 31 май 11, 09:31    [10736469]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    renaton
    Member

    Откуда:
    Сообщений: 753
    сли нет бэкапов то уже никак не восстановить?
    31 май 11, 09:32    [10736472]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    Гавриленко Сергей Алексеевич
    Member

    Откуда:
    Сообщений: 37254
    Закомиченные транзакции можно вовсстановить только из бэкапа. Если нет бэкапа, то штатными средствами никак.

    Сообщение было отредактировано: 31 май 11, 10:01
    31 май 11, 10:01    [10736570]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    Shlippenbaranus
    Member

    Откуда:
    Сообщений: 241
    Гавриленко Сергей Алексеевич
    Закомиченные транзакции можно вовсстановить только из бэкапа


    Э... Значит ли это, что в MS SQL можно сделать вот так:
    begin transaction
    truncate table nax
    rollback
    
    - и таблица останется прежней?

    Я привык думать, что truncate - DDL операция (она, условно, пересоздает таблицу, а не работает с данными в ней), и поэтому не может быть отменена принципиально. Т.е. понятие транзакции, как группы операций по изменению данных, тут как бы вообще неприменимо. Т.е. truncate, это как бы drop table и create table в одной упаковке. Таким образом, даже если бы ув. renaton проводил truncate "с транзакцией", это ему бы ничуть не помогло.

    Или в MS SQL смысл truncate понимается как-то иначе?
    31 май 11, 11:10    [10736975]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    Shlippenbaranus

    Я привык думать, что truncate - DDL операция (она, условно, пересоздает таблицу, а не работает с данными в ней), и поэтому не может быть отменена принципиально. Т.е. понятие транзакции, как группы операций по изменению данных, тут как бы вообще неприменимо. Т.е. truncate, это как бы drop table и create table в одной упаковке. Таким образом, даже если бы ув. renaton проводил truncate "с транзакцией", это ему бы ничуть не помогло.

    Или в MS SQL смысл truncate понимается как-то иначе?

    С чего она стала DDL, если всего лишь меняет страницы данных ?
    "drop table и create table в одной упаковке" - это ваши фантазии
    renaton как раз написал "Производилась без транзакции"
    MS SQL смысл truncate понимает правильно, но наверное по-другому, чем вы
    31 май 11, 11:19    [10737090]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    iljy
    Member

    Откуда:
    Сообщений: 8711
    Shlippenbaranus,

    а из каких соображений вы решили, что DDL не откатывается??
    use tempdb
    create table tt (id int)
    
    begin tran
    alter table tt add val int
    
    select * from tt
    rollback
    
    select * from tt
    
    drop table tt
    31 май 11, 11:20    [10737110]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    Shlippenbaranus
    Member

    Откуда:
    Сообщений: 241
    Glory
    "drop table и create table в одной упаковке" - это ваши фантазии

    Ну, не фантазии, а, скажем так, аналогии.

    Glory
    MS SQL смысл truncate понимает правильно, но наверное по-другому, чем вы

    Да, по другому. Я, как раз, и хотел узнать, как.

    Хотя слово "правильно" я предпочел бы тут не употреблять (как и слово "неправильно").

    iljy
    Shlippenbaranus,
    а из каких соображений вы решили, что DDL не откатывается??
    use tempdb
    create table tt (id int)
    
    begin tran
    alter table tt add val int
    
    select * from tt
    rollback
    
    select * from tt
    
    drop table tt


    Пф. Круто :). Добрался до базы, проверил. Спасибо.
    31 май 11, 12:27    [10737753]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    Shlippenbaranus
    Glory
    "drop table и create table в одной упаковке" - это ваши фантазии

    Ну, не фантазии, а, скажем так, аналогии.

    Glory
    MS SQL смысл truncate понимает правильно, но наверное по-другому, чем вы

    Да, по другому. Я, как раз, и хотел узнать, как.

    Хотя слово "правильно" я предпочел бы тут не употреблять (как и слово "неправильно").

    - Аналогии с чем ?
    - BOL - TRUNCATE
    Removes all rows from a table without logging the individual row deletions. TRUNCATE TABLE is similar to the DELETE statement with no WHERE clause; however
    31 май 11, 12:30    [10737774]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    Shlippenbaranus
    Member

    Откуда:
    Сообщений: 241
    Glory
    - Аналогии с чем ?

    Аналогии с Oracle. Чем полезно работать с разными СУБД - понимаешь, какое колич-во ньюансов пропадает между строк документации.

    Кстати, тот факт, что truncate для MS SQL, все-таки, аналогичен drop table и create table в одной упаковке, подтверждается тем, что выполнение truncate приводит к сбросу автоматического счетчика значений для колонок identity:
    create table tt (id int identity, val int)
    insert into tt (val) values (1)
    delete tt
    insert into tt (val) values (1)
    select * from tt
    
    begin tran
    truncate table tt
    insert into tt values (1)
    select * from tt
    rollback
    
    begin tran
    drop table tt
    create table tt (id int identity, val int)
    insert into tt (val) values (1)
    select * from tt
    rollback
    
    select * from tt

    Так что без специального уточнения относительно identity column (которое, впрочем, есть в bol) эта вот фраза
    Glory
    TRUNCATE TABLE is similar to the DELETE statement with no WHERE clause
    - неточная
    31 май 11, 13:07    [10738130]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    Shlippenbaranus
    Glory
    - Аналогии с чем ?

    Аналогии с Oracle. Чем полезно работать с разными СУБД - понимаешь, какое колич-во ньюансов пропадает между строк документации.

    Что я не увидел в Oracle "drop table и create table в одной упаковке"
    http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_10007.htm

    Use the TRUNCATE TABLE statement to remove all rows from a table. By default, Oracle Database also performs the following tasks:

    *

    Deallocates all space used by the removed rows except that specified by the MINEXTENTS storage parameter
    *

    Sets the NEXT storage parameter to the size of the last extent removed from the segment by the truncation process

    Removing rows with the TRUNCATE TABLE statement can be more efficient than dropping and re-creating a table. Dropping and re-creating a table invalidates dependent objects of the table, requires you to regrant object privileges on the table, and requires you to re-create the indexes, integrity constraints, and triggers on the table and respecify its storage parameters. Truncating has none of these effects.

    Removing rows with the TRUNCATE TABLE statement can be faster than removing all rows with the DELETE statement, especially if the table has numerous triggers, indexes, and other dependencies.

    Shlippenbaranus
    эта вот фраза
    Glory
    TRUNCATE TABLE is similar to the DELETE statement with no WHERE clause
    - неточная

    Чем же она не точна ?
    31 май 11, 13:11    [10738181]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    Shlippenbaranus

    Кстати, тот факт, что truncate для MS SQL, все-таки, аналогичен drop table и create table в одной упаковке, подтверждается тем, что выполнение truncate приводит к сбросу автоматического

    Что бы вы знали - сброс значение identity осуществляется в системной таблице. Удалять для этого саму таблицу не надо.
    31 май 11, 13:13    [10738200]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    tpg
    Member

    Откуда: Novosibirsk
    Сообщений: 23902
    Shlippenbaranus
    Так что без специального уточнения относительно identity column (которое, впрочем, есть в bol) эта вот фраза
    Glory
    TRUNCATE TABLE is similar to the DELETE statement with no WHERE clause
    - неточная
    Вы просто не умеете читать документацию.
    Вернее, читаете статьи либо по диагонали, либо только верхнюю часть

    BOL
    TRUNCATE TABLE (Transact-SQL)

    Удаляет все строки в таблице, не записывая в журнал удаление отдельных строк. Инструкция TRUNCATE TABLE похожа на инструкцию DELETE без предложения WHERE, однако TRUNCATE TABLE выполняется быстрее и требует меньших ресурсов системы и журналов транзакций.
    .
    .
    .
    Если таблица содержит столбец идентификаторов, счетчик этого столбца сбрасывается до начального значения, определенного для этого столбца. Если начальное значение не задано, используется значение по умолчанию, равное 1. ...
    31 май 11, 13:14    [10738206]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47142
    Shlippenbaranus
    Так что без специального уточнения относительно identity column (которое, впрочем, есть в bol) эта вот фраза
    Glory
    TRUNCATE TABLE is similar to the DELETE statement with no WHERE clause
    - неточная
    Она точная, поскольку утверждается лишь, что похожи ("is similar").
    Есть много других отличий. По поводу логирования я уже цитировал BOL.
    TRUNCATE не запускает триггеры. TRUNCATE не сработает, если есть FOREIGN KEYs,
    TRUNCATE требует тех же прав доступа, что и ALTER TABLE, поэтому обычным пользователям недоступна,
    если не относится к временной таблице и т.п.
    31 май 11, 13:19    [10738245]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    baracs
    Member

    Откуда: Москва
    Сообщений: 7217
    Shlippenbaranus
    Кстати, тот факт, что truncate для MS SQL, все-таки, аналогичен drop table и create table в одной упаковке, подтверждается тем, что выполнение truncate приводит к сбросу автоматического счетчика значений для колонок identity
    Если уж искать подтверждения этому между строк документации, логичнее сослаться на то, что для выполнения TRUNCATE TABLE, требуется разрешение ALTER table_name.
    Но и это ни о чем не говорит, т.к. это требование может логично вытекать из упомянутого вами свойства команды.

    В качестве контрдовода: objectid таблицы после выполенния TRUNCATE TABLE не изменяется, а при выполнении команд DROP TABLE и CREATE TABLE, он изменяется.
    31 май 11, 13:23    [10738280]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    Shlippenbaranus
    Member

    Откуда:
    Сообщений: 241
    Glory
    ............. Truncating has none of these effects.

    Фух. Ну естественно, что ПОЛНОЙ аналогии между truncate и drop/create не наблюдается - а то зачем бы вообще был нужен этот truncate. Аналогия в том, что truncate и drop/create приводят, в целом, к одному эффекту, и являются DDL операциями, а для Oracle все DDL операции имеют общие черты, существенно отличающие их от DML операций, к которым относится delete. Например, DDL операции автоматически коммиттятся, и коммиттят сделанные до их выполенния изменения в данных. Именно эта особенность была бы существенной в рамках данного топика, если б в плане транзакций ms sql вел себя наподобие oracle.

    Чего, как я нынче узнал, [снова] не наблюдается :).

    tpg
    Вы просто не умеете читать документацию.
    Вернее, читаете статьи либо по диагонали, либо только верхнюю часть

    Ага, но это общая беда :). Т.е. это у всех так :). Прочитайте, допустим, ВНИМАТЕЛЬНО, что я сказал

    Shlippenbaranus
    без специального уточнения относительно identity column (которое, впрочем, есть в bol) эта вот фраза
    ... - неточная
    и Вы увидите, что Ваше собственное замечание - напрасное :).

    baracs
    Если уж искать подтверждения этому между строк документации, логичнее сослаться на то, что для выполнения TRUNCATE TABLE, требуется разрешение ALTER table_name.

    Потому что truncate - DDL операция
    baracs
    Но и это ни о чем не говорит, т.к. это требование может логично вытекать из упомянутого вами свойства команды.

    Ага.
    baracs
    В качестве контрдовода: objectid таблицы после выполенния TRUNCATE TABLE не изменяется, а при выполнении команд DROP TABLE и CREATE TABLE, он изменяется.

    Согласен, в конечном счете, любая аналогия - относительная, и необходима постольку, поскольку, еще раз, позволяет выделить нечто, существенное для контекста обсуждения. В этом смысле, моя - исчерпала себя.
    31 май 11, 14:42    [10738991]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    Shlippenbaranus
    Glory
    ............. Truncating has none of these effects.

    Фух. Ну естественно, что ПОЛНОЙ аналогии между truncate и drop/create не наблюдается - а то зачем бы вообще был нужен этот truncate. Аналогия в том, что truncate и drop/create приводят, в целом, к одному эффекту, и являются DDL операциями

    Где они "являются DDL операциями" ? В каких оффициальных документах/стандартах это сказано ?

    Shlippenbaranus
    Например, DDL операции автоматически коммиттятся, и коммиттят сделанные до их выполенния изменения в данных. Именно эта особенность была бы существенной в рамках данного топика, если б в плане транзакций ms sql вел себя наподобие oracle.

    Режим автоматического коммита не зависит от команды, а только от ваших установок соединения
    Просто есть команды, которые запрещено выполнять в явной транзакции
    31 май 11, 14:49    [10739048]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    Shlippenbaranus
    Member

    Откуда:
    Сообщений: 241
    Glory
    Shlippenbaranus
    пропущено...

    Фух. Ну естественно, что ПОЛНОЙ аналогии между truncate и drop/create не наблюдается - а то зачем бы вообще был нужен этот truncate. Аналогия в том, что truncate и drop/create приводят, в целом, к одному эффекту, и являются DDL операциями

    Где они "являются DDL операциями" ? В каких оффициальных документах/стандартах это сказано ?


    Подраздел TRUNCATE TABLE (Transact-SQL) в BOL находится в разделе Инструкции языка описания данных DDL (Transact-SQL). Подойдет?

    Glory
    Shlippenbaranus
    Например, DDL операции автоматически коммиттятся, и коммиттят сделанные до их выполенния изменения в данных. Именно эта особенность была бы существенной в рамках данного топика, если б в плане транзакций ms sql вел себя наподобие oracle.

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

    В MS SQL - да. В Oracle, по крайней мере, до какого-то момента, DDL коммиттились автоматически, независимо от установок. Что и породило мой вопрос.
    31 май 11, 15:20    [10739399]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    Shlippenbaranus

    Подраздел TRUNCATE TABLE (Transact-SQL) в BOL находится в разделе Инструкции языка описания данных DDL (Transact-SQL). Подойдет?

    Да. Спасибо
    31 май 11, 15:26    [10739454]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    Shlippenbaranus
    Member

    Откуда:
    Сообщений: 241
    Glory
    Да. Спасибо


    Пожалуйста. Рад, если сказал что-то новое.
    31 май 11, 15:54    [10739744]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    pkarklin
    Member

    Откуда: Москва (Муром)
    Сообщений: 74930
    Shlippenbaranus,

    В MSDN, да еще на русском, довольно спорно квалифицированы некоторые вещи. В родной документации (BOL) такого нет.
    31 май 11, 16:20    [10740063]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    msdn_msdn
    Guest
    ...Some data manipulation language (DML) operations, such as table truncation, use Sch-M locks to prevent access to affected tables by concurrent operations...

    http://msdn.microsoft.com/en-us/library/ms175519.aspx
    Lock modes -> Schema locks
    31 май 11, 16:35    [10740256]     Ответить | Цитировать Сообщить модератору
     Re: Можно ли отменить TRUNCATE TABLE  [new]
    Гавриленко Сергей Алексеевич
    Member

    Откуда:
    Сообщений: 37254
    Вообще, похоже, в майкрософте сами определиться не могут, куда этот truncate table относить. По логике это все-таки dml. Но db_ddladmin'ом надо быть, чтобы его сделать. ;)
    31 май 11, 16:42    [10740343]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить