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

Откуда:
Сообщений: 1389
При создании триггера выдает такую ошибку:
"Cannot use text, ntext, or image columns in the 'inserted' and 'deleted' tables."

Я так понял что нельзя работать с полями такого типа в триггерах,
как тогда сохранять информацию из этих полей?

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

Как это можно обойти?
29 авг 16, 08:27    [19601013]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31980
RMagistr2015
в голову пришла мысль сделать это с помощью триггеров, но в них работать с полями такого типа нельзя,
о чём говорит сообщение выше
Удивительно, почему ваши программисты предпочли тип "text" типу "varchar(max)"
От "text" рекомендуют отказаться уже как лет 15
29 авг 16, 09:32    [19601105]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
aleks2
Guest
RMagistr2015
При создании триггера выдает такую ошибку:
"Cannot use text, ntext, or image columns in the 'inserted' and 'deleted' tables."

Я так понял что нельзя работать с полями такого типа в триггерах,
как тогда сохранять информацию из этих полей?

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

Как это можно обойти?


Низзя для псевдо таблиц 'inserted' and 'deleted'.
В основной таблице - можно. Ну а ID строки есть в 'inserted'.

Так что пишите историю 'inserted'.
29 авг 16, 09:34    [19601112]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
o-o
Guest
alexeyvg
RMagistr2015
в голову пришла мысль сделать это с помощью триггеров, но в них работать с полями такого типа нельзя,
о чём говорит сообщение выше
Удивительно, почему ваши программисты предпочли тип "text" типу "varchar(max)"
От "text" рекомендуют отказаться уже как лет 15

варианты:
* они знают только типы 'число' и 'текст'
* база времен динозавров, как у нас.
с 7ой версии так и тянется.
переделывать не собираются, все счастливы работать с ntext
29 авг 16, 09:38    [19601126]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
RMagistr2015
Member

Откуда:
Сообщений: 1389
o-o
alexeyvg
пропущено...
Удивительно, почему ваши программисты предпочли тип "text" типу "varchar(max)"
От "text" рекомендуют отказаться уже как лет 15

варианты:
* они знают только типы 'число' и 'текст'
* база времен динозавров, как у нас.
с 7ой версии так и тянется.
переделывать не собираются, все счастливы работать с ntext


База старая и крути её 2005 ms-sql ((((
29 авг 16, 09:57    [19601173]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
aleks2
RMagistr2015
При создании триггера выдает такую ошибку:
"Cannot use text, ntext, or image columns in the 'inserted' and 'deleted' tables."

Я так понял что нельзя работать с полями такого типа в триггерах,
как тогда сохранять информацию из этих полей?

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

Как это можно обойти?


Низзя для псевдо таблиц 'inserted' and 'deleted'.
В основной таблице - можно. Ну а ID строки есть в 'inserted'.

Так что пишите историю 'inserted'.
+ к этому: text можно использовать в триггерах INSTEAD OF в inserted и deleted
29 авг 16, 10:13    [19601236]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31980
RMagistr2015
o-o
варианты:
* они знают только типы 'число' и 'текст'
* база времен динозавров, как у нас.
с 7ой версии так и тянется.
переделывать не собираются, все счастливы работать с ntext


База старая и крути её 2005 ms-sql ((((
varchar(max) появился в 2000-м. Так что да, если базе более 16 лет, то ничего не поделать, legacy :-(

Для вставки вообще нет проблем, берите из основной таблицы, как уже написал aleks2.

Если нужно использовать старые значения в триггерах для удаления/обновления, то нужно триггеры переделать на INSTEAD OF, там эти поля будут видны (новые в inderted/deleted, старые в основной таблице).
29 авг 16, 10:23    [19601275]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
alexeyvg
RMagistr2015
пропущено...


База старая и крути её 2005 ms-sql ((((
varchar(max) появился в 2000-м. Так что да, если базе более 16 лет, то ничего не поделать, legacy :-(

Для вставки вообще нет проблем, берите из основной таблицы, как уже написал aleks2.

Если нужно использовать старые значения в триггерах для удаления/обновления, то нужно триггеры переделать на INSTEAD OF, там эти поля будут видны (новые в inderted/deleted, старые в основной таблице).
VARCHAR(MAX) появился в SQL 2005
29 авг 16, 10:31    [19601316]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
o-o
Guest
alexeyvg
varchar(max) появился в 2000-м.

не было в 2000-ом varchar(max).
появился в 2005-ом
29 авг 16, 10:32    [19601320]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31980
iap
VARCHAR(MAX) появился в SQL 2005
А, точно :-(
29 авг 16, 11:00    [19601423]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
alexeyvg
iap
VARCHAR(MAX) появился в SQL 2005
А, точно :-(
Почему так грустно? Это же было радостное событие!
29 авг 16, 11:23    [19601528]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
o-o
Guest
iap
alexeyvg
пропущено...
А, точно :-(
Почему так грустно? Это же было радостное событие!

потому что чем раньше, тем лучше.
если б 2000-ом сделали, меньше б баз по сей день тащило с собой text-ы
29 авг 16, 11:26    [19601541]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
RMagistr2015
Member

Откуда:
Сообщений: 1389
o-o
iap
пропущено...
Почему так грустно? Это же было радостное событие!

потому что чем раньше, тем лучше.
если б 2000-ом сделали, меньше б баз по сей день тащило с собой text-ы


Скажите, а можно ли безболезненно перебить text в varchar (max)
?
29 авг 16, 12:27    [19601814]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
RMagistr2015
Member

Откуда:
Сообщений: 1389
и ещё вопрос попутно, можно ли везде безболезненно использовать varchar (max)
29 авг 16, 12:28    [19601820]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
iljy
Member

Откуда:
Сообщений: 8711
RMagistr2015
Скажите, а можно ли безболезненно перебить text в varchar (max)
?


Просто сменить тип колонки можно простым ALTER TABLE. Можно даже скрипт написать, который автоматом это для всех полей сделает. С кодом сложнее, если вы использовали WRITETEXT - UPDATETEXT, то придется переписывать.


RMagistr2015
и ещё вопрос попутно, можно ли везде безболезненно использовать varchar (max)

Везде это где? В индексах - нельзя, но везде, где использовался text - можно.
29 авг 16, 13:05    [19602066]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
iljy
С кодом сложнее, если вы использовали WRITETEXT - UPDATETEXT, то придется переписывать.
Обновления фрагментов данных
Инструкция UPDATE теперь поддерживает предложение .WRITE( ) для выполнения частичных обновлений
соответствующих столбцов типов данных больших значений. Это аналогично операциям над указателями
текста WRITETEXT и UPDATETEXT, которые поддерживаются для типов данных text, ntext, image в более ранних версиях SQL Server.
https://msdn.microsoft.com/ru-ru/library/ms178158(v=sql.110).aspx

Так что и переписывать-то не очень уж много
29 авг 16, 13:15    [19602124]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31980
iap
alexeyvg
пропущено...
А, точно :-(
Почему так грустно? Это же было радостное событие!
Ну, грустно, что ошибаюсь часто, каша уже от этих версий 6.0 - .... - 2016 :-)
o-o
если б 2000-ом сделали, меньше б баз по сей день тащило с собой text-ы
Странно, что не стали дорабатывать тип text.
Убрать глупые ограничения, полноценно работать с ним из функций, из триггеров...
Видимо, для этих усовершенствований пришлось поменять хранение, а его не удалось скрестить с старыми функциями UPDATE TEXT
29 авг 16, 13:28    [19602232]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
iljy
Member

Откуда:
Сообщений: 8711
iap
Так что и переписывать-то не очень уж много


Я и не говорю, что много, но изменения кода на практике очень плохо автоматизируются, так что переделка будет ручками.
29 авг 16, 13:30    [19602255]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
RMagistr2015
Member

Откуда:
Сообщений: 1389
aleks2
RMagistr2015
При создании триггера выдает такую ошибку:
"Cannot use text, ntext, or image columns in the 'inserted' and 'deleted' tables."

Я так понял что нельзя работать с полями такого типа в триггерах,
как тогда сохранять информацию из этих полей?

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

Как это можно обойти?


Низзя для псевдо таблиц 'inserted' and 'deleted'.
В основной таблице - можно. Ну а ID строки есть в 'inserted'.

Так что пишите историю 'inserted'.


Сделал через varchar (max), Большое спасибо большое всем ))))
7 сен 16, 09:05    [19635453]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
RMagistr2015
Member

Откуда:
Сообщений: 1389
А можно ли создать триггер к базе данных, что бы он отслеживал изменение данных в определённой таблице
7 сен 16, 13:24    [19637296]     Ответить | Цитировать Сообщить модератору
 Re: text в триггере  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4183
o-o
iap
пропущено...
Почему так грустно? Это же было радостное событие!

потому что чем раньше, тем лучше.
если б 2000-ом сделали, меньше б баз по сей день тащило с собой text-ы


Билл Гейтс в 90-х сказал, что наша задача не в том, чтобы сделать продукт, удовлетворяющий сразу многим требованиям юзеров, а в том, чтобы выпускать версии часто.
8 сен 16, 10:17    [19640678]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить