Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: CL | DM;

Вниз

Помогите написать простенький триггер :( (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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.022 c
3-1077853217
Апач
2004-02-27 06:40
2004.03.28
Update без выполнения триггеров


4-1074350222
MadGhost
2004-01-17 17:37
2004.03.28
Принимать сообщения и их обрабатывать. как бы интерфейс.


4-1074001403
_echo
2004-01-13 16:43
2004.03.28
FindNextFileA


9-1062240307
TButton
2003-08-30 14:45
2004.03.28
doCollision


1-1079002982
fatal
2004-03-11 14:03
2004.03.28
TreeView как в касперском