Журнал транзакций для базы данных "tempdb" заполнен из-за "активной транзакции"
Я использую Microsoft SQL Server 2014 и столкнулся с некоторыми проблемами, пытаясь создать временную таблицу. Я уже однажды запускал этот код без проблем, но когда я попытался выполнить запрос Сегодня, я получил одну из двух ошибок "в базе данных уже есть объект с именем '#AllClasses'" или "журнал транзакций для базы данных 'tempdb' заполнен из-за 'ACTIVE_TRANSACTION'."Я вставил часть кода ниже:
CREATE TABLE #AllClasses(studentId uniqueidentifier, ClassName nvarchar(100), SchoolName nvarchar(100), AcademicYearId uniqueidentifier, UserGroupId uniqueidentifier, SchoolId uniqueidentifier, ClassId uniqueidentifier, UserGroupOrganizationStatusId tinyint);
CREATE UNIQUE INDEX #I_AllClasses ON #AllClasses (StudentId, UserGroupId);
INSERT #AllClasses(studentId, ClassName, SchoolName, AcademicYearId, UserGroupId, SchoolId, sc.ClassId, u.UserGroupOrganizationStatusId)
SELECT sc.studentId, c.ClassName, u.UserGroupOrganizationName, c.AcademicYearId, c.UserGroupId, c.SchoolId, sc.ClassId, u.UserGroupOrganizationStatusId
FROM StudentClassCrossReference sc
INNER JOIN class c ON sc.ClassId = c.classId
INNER JOIN School s ON s.SchoolId = c.SchoolId
INNER JOIN dbo.UserGroupOrganization u ON u.UserGroupOrganizationId = s.UserGroupOrganizationId
GROUP BY sc.studentId, c.classname, u.UserGroupOrganizationName, u.UserGroupOrganizationId, c.AcademicYearId, c.UserGroupId, c.SchoolId, sc.ClassId, u.UserGroupOrganizationStatusId
HAVING u.UserGroupOrganizationStatusId = 0
Когда я пытаюсь удалить таблицу, я получаю новую ошибку, которая гласит:, "Невозможно удалить таблицу " #все классы", потому что она не существует или у вас нет разрешения."
DROP Table #LS25Student, #AllClasses, #LS25PageSession, #LS25PsByClass
И когда я попытался использовать оператор IF для удаления таблицы, я получил ошибку "журнал транзакций для 'tempdb' полон из-за'ACTIVE_TRANSACTION'."
IF OBJECT_ID('tempdb.dbo.#AllClasses', 'U') IS NOT NULL
DROP TABLE #AllClasses;
IF OBJECT_ID('tempdb.dbo.#LS25Student', 'U') IS NOT NULL
DROP TABLE #LS25Student;
IF OBJECT_ID('tempdb.dbo.#LS25PageSession', 'U') IS NOT NULL
DROP TABLE #LS25PageSession;
IF OBJECT_ID('tempdb.dbo.#LS25PsByClass', 'U') IS NOT NULL
DROP TABLE #LS25PsByClass;
Я могу запускать другие запросы без проблем. Любые предложения по исправлению этого конкретного запроса будут высоко оценены.
3 ответов:
Вы можете искать все временные объекты с помощью простого
SELECT * FROM tempdb..sysobjects WHERE name LIKE '%AllClasses%'
Чтобы исправить это, просто запустите один раз:BEGIN TRANSACTION DROP TABLE #AllClasses COMMIT TRANSACTIONЕсли вы все еще не можете удалить его, просто проверьте сеансы зомби с
SELECT * FROM sys.dm_exec_sessionsи убейте его сKILL session_id.
Что касается проблемы отбрасывания таблицы, я, кажется, это происходит, когда вложенный вызов процедуры имеет временную таблицу с тем же именем, что и временная таблица в вызывающей процедуре.
Я также очень часто видел осиротевшие spids, где временная таблица находится в состоянии зомби и не совпадает, когда вы проверяете objectid. Если это первая проблема, просто переименуйте временную таблицу.
Я бы также проверил активные spid и посмотрел, есть ли какие-либо зависшие транзакции, которые также могут быть причиной проблемы с журналом транзакций, а затем убить их. Видsys.dm_exec_sessions, чтобы увидеть, что работает.
Для меня Отключение от БД (щелкните правой кнопкой мыши на нем в Обозревателе объектов - отключить) и повторное подключение снова Исправлена проблема.
Comments