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

Откуда:
Сообщений: 4
Привет всем.

Имеются 2 таблицы:

1.
CustomerID INT NOT NULL
FirstName Nvarchar(50 ) NOT NULL
LastName Nvarchar(50) NOT NULL
2.
OrderID INT Not NULL
CustomerID INT NOT NULL
OrderDate datetime Not NULL

О триггерах:
Log all updates to Customer table to CusAudit table ,indicate the previous and new values of data , date and time and the login name of the person who made the changes
12 май 13, 07:43    [14283325]     Ответить | Цитировать Сообщить модератору
 Re: Log все updates в таблице  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
DataBinder
Привет всем.

Привет! А надо-то что?
12 май 13, 10:19    [14283381]     Ответить | Цитировать Сообщить модератору
 Re: Log все updates в таблице  [new]
DataBinder
Member

Откуда:
Сообщений: 4
Knyazev Alexey,

Как написать триггер, который будет записывать все UPDATE для Customer table в CusAudit table, указывая старые величины и новые, дату и время, login пользователя, который сделал изменения
12 май 13, 18:57    [14284240]     Ответить | Цитировать Сообщить модератору
 Re: Log все updates в таблице  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
DataBinder,
>>указывая старые величины и новые
Использование таблиц inserted и deleted
>>дату и время
GETDATE()
>>login name
SUSER_NAME()
12 май 13, 19:45    [14284306]     Ответить | Цитировать Сообщить модератору
 Re: Log все updates в таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
DataBinder
Knyazev Alexey,

Как написать триггер, который будет записывать все UPDATE для Customer table в CusAudit table, указывая старые величины и новые, дату и время, login пользователя, который сделал изменения
Зачем туда писать новые значения?
Они же и так в оригинальной таблице прописаны!

Начните с чтения статьи Журналирование изменений структуры БД и данных.
Потом поищите по форуму - статья слегка устарела (всё-таки, две-три версии сервера ещё вышли).
Публикуйте свой вариант - покритикуем, посоветуем
12 май 13, 19:53    [14284327]     Ответить | Цитировать Сообщить модератору
 Re: Log все updates в таблице  [new]
DataBinder
Member

Откуда:
Сообщений: 4
CREATE TABLE CusAudit
(
CustomerIDOld int,
FirstNameOld NVARCHAR(50),
LastNameOld NVARCHAR(50),
AddressOld NVARCHAR(60),
CustomerIDNew int,
FirstNameNew NVARCHAR(50),
LastNameNew NVARCHAR(50),
AddressNew NVARCHAR(60),
[Date Time] NVARCHAR(50),
[User Name] NVARCHAR(50)
);

CREATE TRIGGER tr_Customer_LogTo_CusAudit
ON Customer
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;

IF EXISTS (SELECT * FROM inserted)
BEGIN
IF EXISTS (SELECT * FROM deleted)
BEGIN

DECLARE @DateAndTime DATETIME = GETDATE();
DECLARE @UserName SYSNAME = SUSER_SNAME();
INSERT CusAudit
(
CustomerIDOld,
FirstNameOld,
LastNameOld,
AddressOld,
CustomerIDNew,
FirstNameNew,
LastNameNew,
AddressNew,
[Date Time],
[User Name]
)
SELECT
CustomerID,
FirstName,
LastName,
[Address]
FROM deleted
UNION ALL
SELECT
CustomerID,
FirstName,
LastName,
[Address],
GETDATE(),
SUSER_SNAME()
FROM inserted;

select * from CusAudit;

END;

END;

END;
GO

Не работает. Говорит, что UNION ALL требует одинаковое число столбцов, как из DELETE, так и из INSERT. Вопрос - куда внести GETDATE() и SUSER_SNAME()?

2.----------------
Если испльзовать другую форму, то дает сообщение во второй update , что таблица CusAudit уже существует:

SELECT
@CustomerIDOld AS CustomerIDOld,
@FirstNameOld AS FirstNameOld,
@LastNameOld AS LastNameOld,
@AddressOld AS AddressOld,
@CustomerIDNew AS CustomerIDNew,
@FirstNameNew AS FirstNameNew,
@LastNameNew AS LastNameNew,
@AddressNew AS AddressNew,
@DateAndTime AS [Date Time],
@UserName AS [User Name]
INTO CusAudit;
13 май 13, 03:59    [14285539]     Ответить | Цитировать Сообщить модератору
 Re: Log все updates в таблице  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
DataBinder
INSERT CusAudit
(
CustomerIDOld,
FirstNameOld,
LastNameOld,
AddressOld,
CustomerIDNew,
FirstNameNew,
LastNameNew,
AddressNew,
[Date Time],
[User Name]
)
SELECT
CustomerID,
FirstName,
LastName,
[Address]
FROM deleted
UNION ALL
SELECT
CustomerID,
FirstName,
LastName,
[Address],
GETDATE(),
SUSER_SNAME()
FROM inserted;


Не работает. Говорит, что UNION ALL требует одинаковое число столбцов


ну так укажите одинаковое число столбцов

автор
Вопрос - куда внести GETDATE() и SUSER_SNAME()?

либо указать дефолты в вашей исходной таблице, либо перечислить и при выборке из deleted и inserted

автор
Если испльзовать другую форму, то дает сообщение во второй update , что таблица CusAudit уже существует:

SELECT
@CustomerIDOld AS CustomerIDOld,
@FirstNameOld AS FirstNameOld,
@LastNameOld AS LastNameOld,
@AddressOld AS AddressOld,
@CustomerIDNew AS CustomerIDNew,
@FirstNameNew AS FirstNameNew,
@LastNameNew AS LastNameNew,
@AddressNew AS AddressNew,
@DateAndTime AS [Date Time],
@UserName AS [User Name]
INTO CusAudit;

И не удивительно...вы вообще в курсе, как работает инструкция SELECT...INTO ?
http://msdn.microsoft.com/ru-ru/library/ms188029.aspx
13 май 13, 06:07    [14285565]     Ответить | Цитировать Сообщить модератору
 Re: Log все updates в таблице  [new]
aleks2
Guest
DataBinder
UNION ALL
SELECT
CustomerID,
FirstName,
LastName,
[Address],
GETDATE(),
SUSER_SNAME()
FROM inserted;


А нафега из inserted то в журнал писать? Оно, вроде, и так в таблице есть...
13 май 13, 06:50    [14285587]     Ответить | Цитировать Сообщить модератору
 Re: Log все updates в таблице  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
aleks2
А нафега из inserted то в журнал писать? Оно, вроде, и так в таблице есть...
Похоже, что это тестовое задание, и похоже, что ТСу нужно в одной строке добавить два поля: Старое и Новое значение.
13 май 13, 07:03    [14285597]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить