Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-1077874734
paul_k
2004-02-27 12:38
2004.03.28
Где бы пример найти


6-1073621638
Hooch
2004-01-09 07:13
2004.03.28
Outlook Express


14-1078054496
Thor
2004-02-29 14:34
2004.03.28
Что за текст?


14-1077742895
KroT
2004-02-26 00:01
2004.03.28
Значок.


9-1062317384
booblik
2003-08-31 12:09
2004.03.28
фатал еррор





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский