![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите написать простенький триггер :( (MS SQL 2000)
Layner © (2004-02-26 14:45:00)Есть табл, вставляю строку, при вставке, должны подставится ещё 1 значения в эту же строку, а именно CURRENT_TIMESTAMP.
Структура табл loginтакая
rowid, (счетчик)
ip, (строка)
datetime_ins(время)
И выполняя этот скрипт,
INSERT INTO log (ip) VALUES ('127.0.0.1')
в datetime_ins должно подставится время сервера.
По началу я делал все в INSERT, и время тоже, но время можно на компьютере клиента установить любое.. поэтому это не выход.. и захотелось вот с триггером.. только в теории был с ними знаком, а как дело дошло, то написать не могу :( Из книг вытащил только CURRENT_TIMESTAMP.
CREATE TRIGGER [login_in] ON [dbo].[login]
FOR INSERT
AS
??
Заранее спасибо за любую помощь.
Delirium (2004-02-26 17:06:00) [1]Разумеется, а как-же иначе первая стока (с NULL), это то, что ты сам вставил в таблицу, вторую строку добавил триггер на осное предыдущей, а тебе что нужно-то? Аудит, или просто установка даты модификации?
Layner (2004-02-26 16:57:00) [2]Да, именно этот скрип "втыкает" 2 строки, т.е. одну, какую надо, а вторую с NULL. :( Сейчас почитаю от KSergey пост, дома доделаю.
CREATE TRIGGER [test] ON [dbo].[login]
FOR INSERT
AS
INSERT INTO login (ip, time_in, login) SELECT ip, GetDate(), login FROM INSERTED
Vuk (2004-02-26 16:50:00) [3]Кстати, можно и
INSERT INTO login (ip, time_in, login) SELECT ip, GetDate(), login FROM INSERTED
Только тогда триггер должен быть не insert, а instead insert
KSergey (2004-02-26 16:49:00) [4]> [9] Delirium © (26.02.04 16:42)
К сожалению, вами не приведен полный текст триггера. А потому не понятно, на какую таблицу сей триггер навешан. Возможно предполагалось, что не на Log. ;)
Однако в триггере, опубликованном > [7] Layner © (26.02.04 16:17)произойдет вставка в ту же самую таблицу!
Delirium (2004-02-26 16:46:00) [5](Delirium © (26.02.04 14:58) [3]) Данный пост считать не правильным, правильный пост всё-таки (Delirium © (26.02.04 14:48) [1]), поле rowid надо сделать Identity, а у поля datetime_ins установить default GetDate()
Delirium (2004-02-26 16:42:00) [6]"И что получится? При вставке в таблицу вставится еще одна строка? Вы это, думайте что делаете ;)" - всё правильно, это называется "аудит" - история изменений, если я правильно понял, это и надо
KSergey (2004-02-26 16:37:00) [7]> [7] Layner © (26.02.04 16:17)
> [3] Delirium © (26.02.04 14:58)
> [1] Delirium © (26.02.04 14:48)
И что получится? При вставке в таблицу вставится еще одна строка? Вы это, думайте что делаете ;)
Тогда уж > [4] Vuk © (26.02.04 14:58)
Хотя, конечно, самое верное в данном случае - > [5] just me (26.02.04 15:40)
PS
Вот так я ловко ярлыки всем развешал ;)
А вот такой скрипт добавляет в таблицу поля и триггеры для фиксации кто, когда, откуда запись вставил и последний раз изменил. Может кому пригодится, хотя, конечно, ничего сверхестественного в нем нет. Когда-то для себя сделал.
/************************************************************************************************
* В указанную таблицу добавляются поля:
* [CreateUser] - пользователь создавний запись
* [CreateHost] - хост создавний запись
* [CreateDate] - дата создания записи
* [UpdateUser] - пользователь изменивший запись (без изменения = NULL)
* [UpdateHost] - хост изменивший запись (без изменения = NULL)
* [UpdateDate] - дата изменения записи (без изменения = NULL)
*
* В таблицу добавляется триггер обновления, заполняющий поля UpdateUser, UpdateHost, UpdateDate.
*
************************************************************************************************/
DECLARE @TableName VARCHAR(100), @UniqueIndexFld VARCHAR(100), @SQL VARCHAR(1000)
SET @TableName='tbTQPSTablesColumns' -- здесь указать имя таблицы
SET @UniqueIndexFld='ID' -- здесь указать имя уникального поля (ID)
SET @SQL = '
ALTER TABLE [dbo].[' + @TableName + '] ADD
[CreateUser] [nvarchar] (128) DEFAULT (suser_sname()) NOT NULL ,
[CreateHost] [nchar] (32) DEFAULT (host_name()) NOT NULL ,
[CreateDate] [datetime] DEFAULT (getdate()) NOT NULL ,
[UpdateUser] [nvarchar] (128),
[UpdateHost] [nchar] (32),
[UpdateDate] [datetime]'
EXEC(@SQL) -- создать новые поля
SET @SQL = '
/*
* Триггер заносит информацию о дате изменений и о пользователе сделавшем изменения
*
* (c) Касаткин С.М. ' + RIGHT('0'+CAST(DATEPART(dd, GETDATE()) AS VARCHAR), 2) + '.' + RIGHT('0'+CAST(DATEPART(mm, GETDATE()) AS VARCHAR), 2) + '.' + CAST(DATEPART(yyyy, GETDATE()) AS VARCHAR) + '
*/
CREATE TRIGGER [tr_' + @TableName + '_Up_SetUser] ON dbo.[' + @TableName + ']
FOR UPDATE
AS
SET NOCOUNT ON
UPDATE [' + @TableName + ']
SET UpdateUser=suser_sname(), UpdateHost=host_name(), UpdateDate=getdate()
FROM [' + @TableName + '], Inserted
WHERE [' + @TableName + '].[' + @UniqueIndexFld + ']= Inserted.[' + @UniqueIndexFld + ']'
EXEC(@SQL) -- создать триггер
Layner (2004-02-26 16:17:00) [8]Не, поле TimeStamp не прокатывает, зато совет Delirium нормально "прокатил", поля немного другие, но все отлично, сейчас ещё доработаю на UPDATE, и вообще класс!!!
CREATE TRIGGER [test] ON [dbo].[login]
FOR INSERT
AS
INSERT INTO login (ip, time_in, login) SELECT ip, GetDate(), login FROM INSERTED
Всем огромное спасибо!
Layner (2004-02-26 16:01:00) [9]А понял, т.е. без тригерка можно обойтись, хорошо, так и сделаю, но синтаксис тригеров и др. ф-й буду учить. :)
just me (2004-02-26 15:40:00) [10]Для поля datetime_ins задать нужное default value
Delirium (2004-02-26 14:58:00) [11]
insert log (rowid, ip, datetime_ins)
select (select max(rowid)+1 from log),
ip,
GetDate()
from Inserted
Чтобы ответ был полным
Vuk (2004-02-26 14:58:00) [12]что-то типа того:
update l
set
datetime_ins = getdate()
from
inserted i join
login l on l.rowid = i.rowid
stas (2004-02-26 14:50:00) [13]Есть тип поля TimeStamp, который автоматом проставляет время
Delirium (2004-02-26 14:48:00) [14]
INSERT INTO log (ip) SELECT ip FROM INSERTED