powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как в триггере работать с временными таблицами
10 сообщений из 10, страница 1 из 1
Как в триггере работать с временными таблицами
    #32006628
Sasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ситуация такая: из триггера вызывается ХП. В ней нужно создать временную таблицу и закачать туда данные. Использовать CREATE TABLE нельзя, т.к. в триггере это запрещено. Остается использовать Select * into #temp. Но проблема в том, что Select нужно формировать динамически и выполнять exec'ом. После выполнения exec в ХП таблица #temp не видна, наверное, потому что exec выполняет SQL как отдельный батч.
Подскажите, пожалуйста, как вывернуться ?
...
Рейтинг: 0 / 0
Как в триггере работать с временными таблицами
    #32006653
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
select * into ##Tmp, т.е. селект в глобальную временную таблицу
...
Рейтинг: 0 / 0
Как в триггере работать с временными таблицами
    #32006665
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Sasha
А не приведёте текст ХП? Ну не верю я что нужно обязательно формировать динамически создание таблиц.
...
Рейтинг: 0 / 0
Как в триггере работать с временными таблицами
    #32006669
У нас в приложении очень много используются триггера.
Проблема с временными таблицами решается одним методом:
Все временные таблицы необходимые для работы триггера создаются до обработки таблицы.
В триггере таблицы только очищаются перед использованием.
...
Рейтинг: 0 / 0
Как в триггере работать с временными таблицами
    #32006674
Sasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 SergSuper

Вот часть ХП:

select @sqlstr='begin tran
select l.Id, l.RecId into #idlog
from #u_delete d, u_log l
where d.'+@IdName+' = l.RecId
commit'
exec(@sqlstr)

Дело в том, что я не знаю заранее имя первичного ключа в #u_delete (это просто копия таблицы deleted из триггера), поэтому приходится использовать exec.

Решение проблемы я уже нашел. Нужно просто создать пустую временную таблицу, а потом через exec туда писать.

select Id, RecId into #idlog from u_log where 1 = 0

exec(@sqlstr) ...

Но остается вопрос об области видимости временных таблиц. Вроде бы временная таблица видна везде в области коннекта, а получается что во внешних ХП (если она создается во вложенной ХП или exec'ом) она не видна.
...
Рейтинг: 0 / 0
Как в триггере работать с временными таблицами
    #32006680
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Sasha
Мне как раз и интересно: зачем задавать имя столбца как переменную? Я просто так никогда не делал и интересно посмотреть на задачу, которая требует это.
...
Рейтинг: 0 / 0
Как в триггере работать с временными таблицами
    #32006683
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот что я сделал
select * into #Tmp from MyTable
create proc #PTmp as select * from #Tmp
exec #PTmp
работает
Далее
create proc MyProc as select * from #Tmp
exec MyProc
тоже работает
А вот если exec-ом, то не выходит
Говорю в последний раз
exec('select * into ##Tmp from MyTable')
create proc MyProc as select * from ##Tmp
exec MyProc
...
Рейтинг: 0 / 0
Как в триггере работать с временными таблицами
    #32006706
Sasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 SergSuper

Задача: при у далении из некоторых таблиц нужно сохранить удаленные записи. К сожелению, такие у нас пользователи. Поудаляют данные, а потом наезжают, что программа не работает и.т.д. Просто послать их нельзя, т.к. организация серьезная. Поскольку такие ошибки происходят часто, то нужно как-то вести журнал удаленных записей, чтобы все можно было отследить.
БД спроектирована так, что в разных таблицах PK может иметь разные имена. В таблице deleted со строками можно работать только через PK. Вот мне и нужно задавать имя поля PK для извлечения id.
...
Рейтинг: 0 / 0
Как в триггере работать с временными таблицами
    #32006708
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Но остается вопрос об области видимости временных таблиц. Вроде бы временная таблица видна везде в области коннекта, а получается что во внешних ХП (если она создается во вложенной ХП или exec'ом) она не видна.

У Вас уже два ответа есть! Скажите что Вас не устраивает?
...
Рейтинг: 0 / 0
Как в триггере работать с временными таблицами
    #32006712
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Garya Привилегированный пользователь
Участник
Для решения такой задачи нужно просто в соответствующие таблицы добавить поле [Deleted] bit. И триггер:
Create trigger ttt on MyTable
for DELETE
as -- Заменяет физическое удаление на логическое
insert into MyTable
select Fld1, Fld2, Fld3, 1 -- 1 должна попасть в поле [Deleted]
from Deleted

И View:
select Fld1, Fld2, Fld3 from MyTable where [Deleted]<>1

И всё! Вместо того, чтобы давать прямой доступ к таблицам, работай со View. Восстановление удаленной записи сводится к сбросу флага [Deleted].
В этот же триггер можно воткнуть регистрацию, когда кем удалена и с какого компьютера. У меня работает еще сложнее. Регистрируются любые модификации данных. Журнал ведется в самой исходной таблице. Отслеживается история изменений одной и той же записи независимо :
- по оси календарного времени
- по оси учетного времени
все модификации производятся добавлением новых версий записей (с помощью Instead-триггеров). Вместо одного идентификатора используется несколько (идентификатор записи как совокупности всех редакций на всех осях, идентификатор редакции на оси учетного времени, идентификатор редакции на оси календарного времени). Конфликты репликации отсутствуют непрочь. Не смотря на то, что MERGE-репликация задействуется по схеме приоритетов, во VIEW выбор идет по календарной дате последней модификации. Поэтому наряду с журнализацией решается проблема устранения несогласованности транзакций при MERGE-репликации.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как в триггере работать с временными таблицами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]