Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 пятничный конкурс "самый идиотский триггер"  [new]
o-o
Guest
предлагаю постить сюда шедевры триггерописания.
не все способны наваять, а главное, запустить в продакшен
что-то вроде этого:
CREATE  trigger [dbo].[legutent_UPD_UGC] on [dbo].[legutent] for update
as
declare @bit int ,
@id_colonna int ,
@char int,
@tblname varchar(255),
@colname varchar(255),
@oldv nvarchar(255),
@newv nvarchar(255),
@sql nvarchar(500),
@nome_colonna varchar(255),
@CODUTENTE int
select @id_colonna = 0
 
DECLARE colonne_cursor CURSOR FOR
select name,colid from syscolumns       
        where id = (select id from sysobjects where name='legutent')
                and  ( name not in ('sessionID','connesso') )
OPEN colonne_cursor
 
FETCH NEXT FROM colonne_cursor
INTO @nome_colonna, @id_colonna
 
WHILE @@FETCH_STATUS = 0
BEGIN
                --print convert(char,@id_colonna) +  convert(char,@nome_colonna)
          select @id_colonna = @id_colonna
    select @bit = (@id_colonna - 1 )% 8 + 1
    select @bit = power(2,@bit - 1)
    select @char = ((@id_colonna - 1) / 8) + 1
    if (substring(COLUMNS_UPDATED(),@char, 1) & @bit > 0)
    begin
      --print 'campo modificato: ' +@nome_colonna
 
                        select @codutente=codutente from inserted
 
                        INSERT INTO dbo.legutent_storico_UGC
                        (CODUTENTE, NOMEUTENTE,
                                PASSWORD, EXPDATE, VALIDITYDATE,
                                LOGINNAME, ABILITATO, DATA_CREAZIONE,
                                DATA_REVOCA, SOLALETTURA, CODPROFILO,
                                CONNESSO, SESSIONID, IDBANCA,
                                AUTORIZZAZIONE_DEFAULT, CURRENCY, PREFISSO,
                                NUMERO, CODINDIVIDUO, AUTORIZZAZIONE_FAM_DEFAULT,
                                CODUTENTEULTMOD, DATAULTMOD, NOTE_REVOCA,
                                [SOSPESO],      [DATA_SOSPENSIONE] ,    [NOTE_SOSPENSIONE] ,    [DESTINATARIO_MESSAGGI] ,
                                [ENABLE_UTENTI_EXT], [DATA_PREVISTA_SOSPENSIONE],
                                dataora,azione,utente_db)
                        SELECT CODUTENTE, NOMEUTENTE,
                                '', EXPDATE, '19000101',
                                '', ABILITATO, DATA_CREAZIONE,
                                DATA_REVOCA, SOLALETTURA, CODPROFILO,
                                CONNESSO, SESSIONID, IDBANCA,
                                AUTORIZZAZIONE_DEFAULT, CURRENCY, PREFISSO,
                                NUMERO, CODINDIVIDUO, AUTORIZZAZIONE_FAM_DEFAULT,
                                CODUTENTEULTMOD, DATAULTMOD, NOTE_REVOCA,
                                0, null, null, [DESTINATARIO_MESSAGGI],
                                [ENABLE_UTENTI_EXT], null,
                                getdate(),'U',SYSTEM_USER
                        FROM deleted
                       
                        INSERT INTO legutent_storico_relazioni_UGC
                                (ID, COD_TABELLA,TABELLA, VALORE_1)
                                select @@IDENTITY ,1,'PORTAFOGLI_AUTORIZZAZIONI',cod_portafoglio
                                from PORTAFOGLI_AUTORIZZAZIONI where codutente=@codutente
                       
                        INSERT INTO legutent_storico_relazioni_UGC
                                (ID, COD_TABELLA,TABELLA, VALORE_1)
                                select @@IDENTITY ,2,'FAMIGLIE_AUTORIZZAZIONI',cod_famiglia
                                from FAMIGLIE_AUTORIZZAZIONI where codutente=@codutente
 
 
                        BREAK
 
    end
   FETCH NEXT FROM colonne_cursor
   INTO @nome_colonna, @id_colonna
END
 
CLOSE colonne_cursor
DEALLOCATE colonne_cursor
 
 

Картинка с другого сайта.Картинка с другого сайта.Картинка с другого сайта.
11 ноя 16, 21:50    [19884981]     Ответить | Цитировать Сообщить модератору
 Re: пятничный конкурс "самый идиотский триггер"  [new]
_human
Member

Откуда:
Сообщений: 566
o-o,

OMFG
зато не скучно
12 ноя 16, 01:23    [19885390]     Ответить | Цитировать Сообщить модератору
 Re: пятничный конкурс "самый идиотский триггер"  [new]
uaggster
Member

Откуда:
Сообщений: 1003
Смысл ускользает.
О чем говорит интурист?
Интересно, а как это работает в дождь ээээ... при апдейте нескольких строк?
12 ноя 16, 19:58    [19886630]     Ответить | Цитировать Сообщить модератору
 Re: пятничный конкурс "самый идиотский триггер"  [new]
o-o
Guest
смысл видимо такой:
сложить в историческукю таблицу то,
что проапдэйтили, если хоть один столбец проапдэйтился.
а вот чтобы это выяснить -- курсор по всем столбцам.
рассчитано на единичный апдэйт, так устроено приложение,
там в форме одного за раз апдэйтить можно.
и вообще, где разрешено изменение нескольких строк, там курсор по inserted/deleted,
а если такого курсора нет, значит 1 строка за раз.
вот так все очень просто и незамысловато Картинка с другого сайта.
12 ноя 16, 22:54    [19887040]     Ответить | Цитировать Сообщить модератору
 Re: пятничный конкурс "самый идиотский триггер"  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1757
o-o

select id from sysobjects where name='legutent')
                and  ( name not in ('sessionID','connesso')


взрывает мозг))
12 ноя 16, 22:55    [19887042]     Ответить | Цитировать Сообщить модератору
 Re: пятничный конкурс "самый идиотский триггер"  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1757
о-о

у Вас индусская контора чтоле? имена таблиц прям какие то замудренные. на французов похоже чем то.
12 ноя 16, 22:57    [19887052]     Ответить | Цитировать Сообщить модератору
 Re: пятничный конкурс "самый идиотский триггер"  [new]
o-o
Guest
felix_ff
имена таблиц прям какие то замудренные. на французов похоже чем то.

ну вы даете
+ самое что ни на есть

12 ноя 16, 23:59    [19887173]     Ответить | Цитировать Сообщить модератору
 Re: пятничный конкурс "самый идиотский триггер"  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
o-o,

у нас есть триггеры, где есть что-то типа:
if EntityID = 1 then
...
else
if EntityID = 2 then
...
else
...
...
...
if EntityID = 7132 then
...

Но Оракл это как-то прощает. На T-SQL было бы накладнее...
13 ноя 16, 00:53    [19887257]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить