Форум: "Базы";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
ВнизПомогите написать простенький триггер :( (MS SQL 2000) Найти похожие ветки
← →
Layner © (2004-02-26 14:45) [0]Есть табл, вставляю строку, при вставке, должны подставится ещё 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 14:48) [1]
INSERT INTO log (ip) SELECT ip FROM INSERTED
← →
stas © (2004-02-26 14:50) [2]Есть тип поля TimeStamp, который автоматом проставляет время
← →
Delirium © (2004-02-26 14:58) [3]
insert log (rowid, ip, datetime_ins)
select (select max(rowid)+1 from log),
ip,
GetDate()
from Inserted
Чтобы ответ был полным
← →
Vuk © (2004-02-26 14:58) [4]что-то типа того:
update l
set
datetime_ins = getdate()
from
inserted i join
login l on l.rowid = i.rowid
← →
just me (2004-02-26 15:40) [5]Для поля datetime_ins задать нужное default value
← →
Layner © (2004-02-26 16:01) [6]А понял, т.е. без тригерка можно обойтись, хорошо, так и сделаю, но синтаксис тригеров и др. ф-й буду учить. :)
← →
Layner © (2004-02-26 16:17) [7]Не, поле 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
Всем огромное спасибо!
← →
KSergey © (2004-02-26 16:37) [8]> [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) -- создать триггер
← →
Delirium © (2004-02-26 16:42) [9]"И что получится? При вставке в таблицу вставится еще одна строка? Вы это, думайте что делаете ;)" - всё правильно, это называется "аудит" - история изменений, если я правильно понял, это и надо
← →
Delirium © (2004-02-26 16:46) [10](Delirium © (26.02.04 14:58) [3]) Данный пост считать не правильным, правильный пост всё-таки (Delirium © (26.02.04 14:48) [1]), поле rowid надо сделать Identity, а у поля datetime_ins установить default GetDate()
← →
KSergey © (2004-02-26 16:49) [11]> [9] Delirium © (26.02.04 16:42)
К сожалению, вами не приведен полный текст триггера. А потому не понятно, на какую таблицу сей триггер навешан. Возможно предполагалось, что не на Log. ;)
Однако в триггере, опубликованном > [7] Layner © (26.02.04 16:17) произойдет вставка в ту же самую таблицу!
← →
Vuk © (2004-02-26 16:50) [12]Кстати, можно и
INSERT INTO login (ip, time_in, login) SELECT ip, GetDate(), login FROM INSERTED
Только тогда триггер должен быть не insert, а instead insert
← →
Layner © (2004-02-26 16:57) [13]Да, именно этот скрип "втыкает" 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
← →
Delirium © (2004-02-26 17:06) [14]Разумеется, а как-же иначе первая стока (с NULL), это то, что ты сам вставил в таблицу, вторую строку добавил триггер на осное предыдущей, а тебе что нужно-то? Аудит, или просто установка даты модификации?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.034 c