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

Откуда:
Сообщений: 17
Коллеги, прошу помощи. Есть табличка:

сreate table dbo.KBDocument (Id integer not null,
ParentId integer not null,
SortOrder integer,
Name nvarchar(500) not null,
ShortDescription nvarchar(2000),
Description text,
CreatorId integer not null,
EditorId integer not null,
CreateDate datetime not null,
ChangeDate datetime not null,
PublishDate datetime,
IsPublished bit not null)


К ней прицеплен триггер на добавление и изменение:

ALTER TRIGGER [dbo].[trg_KBDocument_IU] 
   ON  [dbo].[KBDocument]
   AFTER INSERT,UPDATE
AS 
BEGIN
	SET NOCOUNT ON;
	
	--set ChangeDate date
	UPDATE [dbo].[KBDocument] SET ChangeDate = GETDATE() FROM [dbo].[KBDocument] as K
	INNER JOIN Inserted as I ON I.Id = K.Id
	
	--set PublishDate for new published documents	
	UPDATE [dbo].[KBDocument] SET PublishDate = GETDATE() FROM [dbo].[KBDocument] as K
	INNER JOIN Inserted as I ON I.Id = K.Id AND 1 = ISNULL(I.IsPublished,0)
	INNER JOIN Deleted as D ON D.Id = K.Id AND 0 = ISNULL(D.IsPublished, 0)
	
	--clear PublishDate for new unpublished documents
	UPDATE [dbo].[KBDocument] SET PublishDate = null FROM [dbo].[KBDocument] as K
	INNER JOIN Inserted as I ON I.Id = K.Id AND 0 = ISNULL(K.IsPublished,0)		 
END


Всплыла задачка все, что в табличку пихается аналогично копировать в некую табличку логирования. Сделал табличку:

create table dbo.KBDocumentlogs (
oldid integer,
newid integer,
oldParentId integer,
newParentId integer,
oldSortOrder integer,
newSortOrder integer,
oldName nvarchar(500),
newName nvarchar(500),
oldShortDescription nvarchar(2000),
newShortDescription nvarchar(2000),
oldDescription text,
newDescription text,
oldCreatorId integer,
newCreatorId integer,
oldEditorId integer,
newEditorId integer,
oldCreateDate datetime,
newCreateDate datetime,
oldChangeDate datetime,
newChangeDate datetime,
oldPublishDate datetime,
newPublishDate datetime,
oldIsPublished bit,
newIsPublished bit)



Написал триггер по учебнику (:-)):

create trigger KBDocumentinsert
on dbo.KBDocument
instead of insert
as
begin
    insert into dbo.KBDocumentlogs (newId, newParentId, newSortOrder, newName, newShortDescription, newDescription, newCreatorId, newEditorId, newCreateDate, newChangeDate, newPublishDate, newIsPublished)
    select Id, ParentId, SortOrder, Name, ShortDescription, Description, CreatorId, EditorId, CreateDate, ChangeDate, PublishDate, IsPublished from inserted i

    insert into dbo.KBDocument (Id, ParentId, SortOrder, Name, ShortDescription, Description, CreatorId, EditorId, CreateDate, ChangeDate, PublishDate, IsPublished)
    select Id, ParentId, SortOrder, Name, ShortDescription, Description, CreatorId, EditorId, CreateDate, ChangeDate, PublishDate, IsPublished from inserted
end


Данные из софтины не вставляются теперь. MS SQL 2012, БД и приложение не мое. Помогите разобраться.

Сообщение было отредактировано: 5 авг 16, 13:36
5 авг 16, 12:53    [19504908]     Ответить | Цитировать Сообщить модератору
 Re: Лог вносимых, изменяемых и удаляемых данных  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1253
поищи в инете скрипт AutoAudit, решит все твои проблемы, правда не с знаниями, а с поставленной задачей :)
5 авг 16, 12:58    [19504959]     Ответить | Цитировать Сообщить модератору
 Re: Лог вносимых, изменяемых и удаляемых данных  [new]
enemyclosed
Member

Откуда:
Сообщений: 17
энди, спасибо, ознакомлюсь, вот только язвить не стоило.
5 авг 16, 13:06    [19505036]     Ответить | Цитировать Сообщить модератору
 Re: Лог вносимых, изменяемых и удаляемых данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
enemyclosed
Написал триггер по учебнику (:-)):
Вы бы просто добавили insert ... select ... from inserted в триггер trg_KBDocument_IU
Зачем вам ещё один триггер, да ещё и instead of?
5 авг 16, 13:14    [19505097]     Ответить | Цитировать Сообщить модератору
 Re: Лог вносимых, изменяемых и удаляемых данных  [new]
enemyclosed
Member

Откуда:
Сообщений: 17
alexeyvg
Вы бы просто добавили insert ... select ... from inserted в триггер trg_KBDocument_IU
Зачем вам ещё один триггер, да ещё и instead of?


Причина:
Description text,
5 авг 16, 13:17    [19505126]     Ответить | Цитировать Сообщить модератору
 Re: Лог вносимых, изменяемых и удаляемых данных  [new]
enemyclosed
Member

Откуда:
Сообщений: 17
энди, прекрасная штука если бы не одно НО - поле типа text оно не логирует.
5 авг 16, 14:05    [19505503]     Ответить | Цитировать Сообщить модератору
 Re: Лог вносимых, изменяемых и удаляемых данных  [new]
Konst_One
Member

Откуда:
Сообщений: 11625
(n)varchar(max) не устроит вместо text?
5 авг 16, 14:06    [19505512]     Ответить | Цитировать Сообщить модератору
 Re: Лог вносимых, изменяемых и удаляемых данных  [new]
enemyclosed
Member

Откуда:
Сообщений: 17
Не устроит по паре причин.
5 авг 16, 14:09    [19505534]     Ответить | Цитировать Сообщить модератору
 Re: Лог вносимых, изменяемых и удаляемых данных  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
enemyclosed
Всплыла задачка все, что в табличку пихается аналогично копировать в некую табличку логирования.
Если делать "в лоб" и костылеобразно:
alter trigger dbo.trg_KBDocument_IU
on dbo.KBDocument
after insert, update
as 
begin
 set nocount on;

 if not exists(select 1 from inserted)
  return;

 update k
  set
   ChangeDate = getdate(),
   PublishDate = case
    when i.IsPublished = 1 and isnull(d.IsPublished, 0) = 0 then getdate()
    when isnull(i.IsPublished, 0) = 0 and d.id is null then null
    else k.PublishDate
   end
 output
  deleted.id, inserted.id, deleted.ParenId, inserted.ParentId, ..., deleted.IsPublished, inserted.IsPublished
  into dbo.KBDocumentlogs 
   (oldid, nedid, oldParentId, newParentId, ..., oldIsPublished, newIsPublished)
 from
  inserted i left join
  deleted d on d.id = i.id join
  dbo.KBDocument k on k.id = i.id;

end;

А если делать нормально, то этот триггер выкинуть и написать новый instead of insert, update, в котором и выполнять все необходимые действия по вставке/изменению/логированию в одной инструкции merge.
5 авг 16, 14:09    [19505536]     Ответить | Цитировать Сообщить модератору
 Re: Лог вносимых, изменяемых и удаляемых данных  [new]
enemyclosed
Member

Откуда:
Сообщений: 17
invm, спасибо за подсказку.
5 авг 16, 14:30    [19505720]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить