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


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

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

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


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

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

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


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

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


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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

Это Вы ошиблись выбором инструментария, в SQL схемы данных планируют заранее.
...
Рейтинг: 0 / 0
Триггер помогите написать.
    #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
Триггер помогите написать.
    #40047336
xerxf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
emolenev,

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


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