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

Откуда:
Сообщений: 41
Добрый день. Ранее с триггерами не сталкивался. Сейчас необходимо написать: есть таблица А в которую происходит insert данных. Таблица состоит из столбцов (id, volume). Необходимо написать триггер который в момент вставки данных в таблицу А будет вставлять эти же данные в таблицу с именем равным id, а если данной таблицы не существует будет ее создавать и записывать.
19 фев 21, 10:23    [22283286]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
msLex
Member

Откуда:
Сообщений: 8700
emolenev
вставлять эти же данные в таблицу с именем равным id, а если данной таблицы не существует будет ее создавать и записывать.


Кто бы это не придумал, устройте ему темную.
19 фев 21, 10:28    [22283291]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
emolenev
Member

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

Это вообще возможно? никогда не имел дело с триггерами.
19 фев 21, 10:33    [22283294]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
msLex
Member

Откуда:
Сообщений: 8700
emolenev
msLex,

Это вообще возможно? никогда не имел дело с триггерами.


Можно, но не нужно

Для начала я бы задался вопросом: "нахрена нужна куча таблиц с "именем равным id", да еще и создающихся динамически?".
Что вы потом с ними делать будете?
19 фев 21, 10:36    [22283295]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8818
msLex
emolenev
msLex,

Это вообще возможно? никогда не имел дело с триггерами.


Можно, но не нужно

Для начала я бы задался вопросом: "нахрена нужна куча таблиц с "именем равным id", да еще и создающихся динамически?".
Что вы потом с ними делать будете?


Похоже, что выводить в Эксель на разные листы
19 фев 21, 11:31    [22283333]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8818
emolenev
msLex,

Это вообще возможно? никогда не имел дело с триггерами.


Можно. Но это НЕправильный подход.

Вы можете выбирать данные по условию : select ... from ... WHERE id = <значение id>;

И если, действительно, Вам надо забирать данные из Экселя ,- используйте условие для получения нужного блока данных в нужном месте.

Если у Вас онлайн-система мобильной торговли и надо раскидывать данные по продаванам по факту получения заказов (ну, или что-то иное реальное для тиражирования и проч..),- не мудрите велосипед, - пишите в раздел "Работа".
19 фев 21, 11:37    [22283341]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
emolenev
Member

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

в таблице с полумиллиардом строк оперативно получить данные по id не получается :)
19 фев 21, 11:44    [22283346]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
emolenev
Member

Откуда:
Сообщений: 41
Триггер выдает ошибку Invalid object name 'INSERTED'.


CREATE TRIGGER [dbo].[TB_INSERT]
ON [dbo].[TB]

AFTER INSERT

as

IF @@ROWCOUNT=0
return
BEGIN

DECLARE @table_name sysname


SET @table_name=(SELECT Id FROM INSERTED)

if OBJECT_ID(@table_name) IS NULL AND OBJECTPROPERTY(OBJECT_ID(@table_name), 'IsTable') <> 1
exec('CREATE TABLE [dbo].['+ @table_name +'] ([ID] [smallint] NOT NULL,[VALUE] [float] NULL)

exec('INSERT INTO ['+ @table_name +'] SELECT * FROM INSERTED')




END
19 фев 21, 11:49    [22283350]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
msLex
Member

Откуда:
Сообщений: 8700
emolenev
SIMPLicity_,

в таблице с полумиллиардом строк оперативно получить данные по id не получается :)

при наличии правильного индекса ничем не отличается от чтения данных из разных таблиц.
19 фев 21, 12:13    [22283370]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
emolenev
Member

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

Например?
19 фев 21, 12:17    [22283372]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
emolenev
Member

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

Таблица (дата время, id, значение)
19 фев 21, 12:18    [22283374]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7435
emolenev,

А секции по какому полю нарезаны? И по каким полям к таблице чаще идёт обращение?
19 фев 21, 12:57    [22283418]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
emolenev
Member

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

дата время, id
19 фев 21, 13:01    [22283426]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
emolenev
Member

Откуда:
Сообщений: 41
С триггером кто - нибудь подскажет?
19 фев 21, 13:03    [22283430]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8818
emolenev
SIMPLicity_,

в таблице с полумиллиардом строк оперативно получить данные по id не получается :)

Ойдаладна .... Кластерный индекс по Id и секционирование ....
19 фев 21, 13:27    [22283454]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8818
emolenev
Триггер выдает ошибку Invalid object name 'INSERTED'.


CREATE TRIGGER [dbo].[TB_INSERT]
ON [dbo].[TB]

AFTER INSERT

as

IF @@ROWCOUNT=0
return
BEGIN

DECLARE @table_name sysname


SET @table_name=(SELECT Id FROM INSERTED)

if OBJECT_ID(@table_name) IS NULL AND OBJECTPROPERTY(OBJECT_ID(@table_name), 'IsTable') <> 1
exec('CREATE TABLE [dbo].['+ @table_name +'] ([ID] [smallint] NOT NULL,[VALUE] [float] NULL)

exec('INSERT INTO ['+ @table_name +'] SELECT * FROM INSERTED')




END




Не-не-не... Вот вторую команду так нельзя. Для неё таблицы INSERTED из триггера не существует...
19 фев 21, 13:29    [22283456]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8818
сначала - из insertrd во временную таблицу. А уже потом - из временной таблицы в нужную в динамическом запросе...
Ну, в общем, там будут "грабли" подпёртые "костылями" ...
Подумайте о секционировании по id .
Либо делайте рабочую таблицу (короткую, например за месяц/неделю/день/час) и длинную - архивную.
Но для анализа (особенно - для ретро-анализа) обычно скорость извлечения данных не критична. Поговорите с "бизнесом",- вероятно они захотели "всего и сразу" просто потому что им сказали что такое можно... У меня такое бывает,- и начинается словами: "Дим, ну ты же всё(!) можешь..."
19 фев 21, 13:36    [22283466]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
msLex
Member

Откуда:
Сообщений: 8700
SIMPLicity_
сначала - из insertrd во временную таблицу. А уже потом - из временной таблицы в нужную в динамическом запросе...
Ну, в общем, там будут "грабли" подпёртые "костылями" ...
Подумайте о секционировании по id .
Либо делайте рабочую таблицу (короткую, например за месяц/неделю/день/час) и длинную - архивную.
Но для анализа (особенно - для ретро-анализа) обычно скорость извлечения данных не критична. Поговорите с "бизнесом",- вероятно они захотели "всего и сразу" просто потому что им сказали что такое можно... У меня такое бывает,- и начинается словами: "Дим, ну ты же всё(!) можешь..."

я уже не говорю, про возможность разных ID в рамках одной операции insert
надо городить курсор


В общем "картина маслом"
Динамический DDL в курсоре в триггере. Прям полная котомка антипаттернов.
19 фев 21, 13:43    [22283474]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3970
emolenev
SIMPLicity_,

в таблице с полумиллиардом строк оперативно получить данные по id не получается :)


данунах, не может быть, как вы пробовали "оперативно" получить и что не получилось?
19 фев 21, 13:44    [22283478]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
Владислав Колосов
Member

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

а если данной таблицы не существует будет ее создавать и записывать


Это Вы ошиблись выбором инструментария, в SQL схемы данных планируют заранее.
19 фев 21, 13:46    [22283484]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1688
emolenev,

уж поверьте база с табличкой в полмиллиарда строк, лучше базы с полумиллиардом таблиц.

у вас банальные какие нибудь клиентские библиотеки (типа EF, или RPC - с линкованных серверов) которые при преобразовании запросов вычитывают метаданные будут просто в ауте.

+ интересно зачем я это пишу?

create or alter trigger [SmashServerOut] on [A] after insert
as
begin
     if @@options & 512 = 0 set nocount on;
     declare @sql nvarchar(max) = N'';
     declare @id int;

     declare cur cursor local fast_forward for
       select [id] from inserted;

     open cur;
     while 1 = 1 begin
          fetch next from cur into @id;
          if @@fetch_status <> 0 break;
     
          if object_id(cast(@id as nvarchar), N'U') is not null begin
              set @sql = formatmessage(N'insert into %s values (%i)', quotename(cast(@id as nvarchar)), @id);
              exec sp_executesql @stmt = @sql;
          end
          else begin
              set @sql = formatmessage(N'create table [dbo].[%s] ([id] int);', cast(@id as nvarchar));
              exec sp_executesql @stmt = @sql;
              set @sql = formatmessage(N'insert into %s values (%i)', quotename(cast(@id as nvarchar)), @id);
              exec sp_executesql @stmt = @sql;
          end;
     end;
     close cur;
     deallocate cur;
end;

19 фев 21, 13:51    [22283489]     Ответить | Цитировать Сообщить модератору
 Re: Триггер помогите написать.  [new]
xerxf
Member

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

имхо самый правильный совет, который вам уже несколько раз написали - не делайте так.
вы как потом с этим безобразием работать собрались?
19 фев 21, 21:03    [22283781]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить