Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер помогите написать. / 22 сообщений из 22, страница 1 из 1
19.02.2021, 10:23
    #40047007
emolenev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
Добрый день. Ранее с триггерами не сталкивался. Сейчас необходимо написать: есть таблица А в которую происходит insert данных. Таблица состоит из столбцов (id, volume). Необходимо написать триггер который в момент вставки данных в таблицу А будет вставлять эти же данные в таблицу с именем равным id, а если данной таблицы не существует будет ее создавать и записывать.
...
Рейтинг: 0 / 0
19.02.2021, 10:28
    #40047010
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
emolenev
вставлять эти же данные в таблицу с именем равным id, а если данной таблицы не существует будет ее создавать и записывать.


Кто бы это не придумал, устройте ему темную.
...
Рейтинг: 0 / 0
19.02.2021, 10:33
    #40047013
emolenev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
msLex,

Это вообще возможно? никогда не имел дело с триггерами.
...
Рейтинг: 0 / 0
19.02.2021, 10:36
    #40047014
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
emolenev
msLex,

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


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

Для начала я бы задался вопросом: "нахрена нужна куча таблиц с "именем равным id", да еще и создающихся динамически?".
Что вы потом с ними делать будете?
...
Рейтинг: 0 / 0
19.02.2021, 11:31
    #40047043
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
msLex
emolenev
msLex,

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


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

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


Похоже, что выводить в Эксель на разные листы
...
Рейтинг: 0 / 0
19.02.2021, 11:37
    #40047048
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
emolenev
msLex,

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


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

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

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

Если у Вас онлайн-система мобильной торговли и надо раскидывать данные по продаванам по факту получения заказов (ну, или что-то иное реальное для тиражирования и проч..),- не мудрите велосипед, - пишите в раздел "Работа".
...
Рейтинг: 0 / 0
19.02.2021, 11:44
    #40047052
emolenev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
SIMPLicity_,

в таблице с полумиллиардом строк оперативно получить данные по id не получается :)
...
Рейтинг: 0 / 0
19.02.2021, 11:49
    #40047054
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
...
Рейтинг: 0 / 0
19.02.2021, 12:13
    #40047065
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
emolenev
SIMPLicity_,

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

при наличии правильного индекса ничем не отличается от чтения данных из разных таблиц.
...
Рейтинг: 0 / 0
19.02.2021, 12:17
    #40047067
emolenev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
msLex,

Например?
...
Рейтинг: 0 / 0
19.02.2021, 12:18
    #40047069
emolenev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
msLex,

Таблица (дата время, id, значение)
...
Рейтинг: 0 / 0
19.02.2021, 12:57
    #40047094
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
emolenev,

А секции по какому полю нарезаны? И по каким полям к таблице чаще идёт обращение?
...
Рейтинг: 0 / 0
19.02.2021, 13:01
    #40047097
emolenev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
env,

дата время, id
...
Рейтинг: 0 / 0
19.02.2021, 13:03
    #40047098
emolenev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
С триггером кто - нибудь подскажет?
...
Рейтинг: 0 / 0
19.02.2021, 13:27
    #40047108
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
emolenev
SIMPLicity_,

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

Ойдаладна .... Кластерный индекс по Id и секционирование ....
...
Рейтинг: 0 / 0
19.02.2021, 13:29
    #40047109
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
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 из триггера не существует...
...
Рейтинг: 0 / 0
19.02.2021, 13:36
    #40047112
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
сначала - из insertrd во временную таблицу. А уже потом - из временной таблицы в нужную в динамическом запросе...
Ну, в общем, там будут "грабли" подпёртые "костылями" ...
Подумайте о секционировании по id .
Либо делайте рабочую таблицу (короткую, например за месяц/неделю/день/час) и длинную - архивную.
Но для анализа (особенно - для ретро-анализа) обычно скорость извлечения данных не критична. Поговорите с "бизнесом",- вероятно они захотели "всего и сразу" просто потому что им сказали что такое можно... У меня такое бывает,- и начинается словами: "Дим, ну ты же всё(!) можешь..."
...
Рейтинг: 0 / 0
19.02.2021, 13:43
    #40047118
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
SIMPLicity_
сначала - из insertrd во временную таблицу. А уже потом - из временной таблицы в нужную в динамическом запросе...
Ну, в общем, там будут "грабли" подпёртые "костылями" ...
Подумайте о секционировании по id .
Либо делайте рабочую таблицу (короткую, например за месяц/неделю/день/час) и длинную - архивную.
Но для анализа (особенно - для ретро-анализа) обычно скорость извлечения данных не критична. Поговорите с "бизнесом",- вероятно они захотели "всего и сразу" просто потому что им сказали что такое можно... У меня такое бывает,- и начинается словами: "Дим, ну ты же всё(!) можешь..."

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


В общем "картина маслом"
Динамический DDL в курсоре в триггере. Прям полная котомка антипаттернов.
...
Рейтинг: 0 / 0
19.02.2021, 13:44
    #40047120
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
emolenev
SIMPLicity_,

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


данунах, не может быть, как вы пробовали "оперативно" получить и что не получилось?
...
Рейтинг: 0 / 0
19.02.2021, 13:46
    #40047124
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
emolenev,

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

Это Вы ошиблись выбором инструментария, в SQL схемы данных планируют заранее.
...
Рейтинг: 0 / 0
19.02.2021, 13:51
    #40047128
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
emolenev,

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

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

интересно зачем я это пишу?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
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;


...
Рейтинг: 0 / 0
19.02.2021, 21:03
    #40047336
xerxf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер помогите написать.
emolenev,

имхо самый правильный совет, который вам уже несколько раз написали - не делайте так.
вы как потом с этим безобразием работать собрались?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер помогите написать. / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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