Главная страница
    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.03 c
8-1069320483
_ncux_
2003-11-20 12:28
2004.03.28
Как сделать свою прогу скрин-сейвером?


3-1077627458
alla l.
2004-02-24 15:57
2004.03.28
D7, б.д. DB2 какую технологию лучше выбрать: BDE, dbExpress?


14-1077629077
raymond
2004-02-24 16:24
2004.03.28
Друзья, как мне скопировать копию рабочего стола в буфер?


14-1077694907
hatchy
2004-02-25 10:41
2004.03.28
Компьютер и Видеомагнитофон


8-1068910424
Artur
2003-11-15 18:33
2004.03.28
Image. (Rotate)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский