Форум: "Прочее";
Текущий архив: 2008.07.20;
Скачать: [xml.tar.bz2];
ВнизMS SQL 2000 Найти похожие ветки
← →
андр. (2008-06-04 10:52) [0]Необходимо в триггере узнать тип известного столбца. Кто сталкивался ?
← →
Правильный_Вася (2008-06-04 10:55) [1]а что, триггер пишется на таблицу, которая еще неизвестна?
← →
андр. (2008-06-04 10:59) [2]Нет пишу триггер который будет вести лог всех изменений в таблице... и при изменение какого либо значение, мне необходимо знать какого типа столбец в котором редактируется значение... Тоже для лога...
← →
Ega23 © (2008-06-04 11:16) [3]
select column_name, is_nullable, data_type from INFORMATION_SCHEMA.COLUMNS where table_name=:table_name and column_name=:column_name
← →
андр. (2008-06-04 11:27) [4]
> Ega23 © (04.06.08 11:16) [3]
спс.
Чтоб ветку не создавать тута вопрос задам:
Это просто к примеру тригер...CREATE TRIGGER [trgLog] ON [dbo].[tLog]
FOR INSERT, UPDATE, DELETE
AS
DECLARE
@IdLog int
IF EXISTS (SELECT * FROM Inserted)
BEGIN
END
ELSE
IF EXISTS (SELECT * FROM Deleted)
BEGIN
END
Вопрос в следующем: Стот ли перепроверять существуют данные для удоления, если в тригере в результат существования данных для вставки отрицательный ? Т.е.:CREATE TRIGGER [trgLog] ON [dbo].[tLog]
FOR INSERT, UPDATE, DELETE
AS
DECLARE
@IdLog int
IF EXISTS (SELECT * FROM Inserted)
BEGIN
END
ELSE
BEGIN
END
← →
Ega23 © (2008-06-04 11:30) [5]А ты посмотри, каким образом триггер на Update работает.
← →
андр. (2008-06-04 11:35) [6]
> Ega23 © (04.06.08 11:30) [5]
Ну на UPDATE я так сделаю:CREATE TRIGGER [trgLog] ON [dbo].[tLog]
FOR INSERT, UPDATE, DELETE
AS
DECLARE
@IdLog int
IF EXISTS (SELECT * FROM Inserted)
BEGIN
IF NOT EXISTS (SELECT * FROM Deleted)
BEGIN
--Вставка записи
END
ELSE
BEGIN
--Обновление записи
END
END
ELSE
IF EXISTS (SELECT * FROM Deleted) -- Вот это интересно не лишнее будет ?
BEGIN
--Удаление записи
END
← →
wicked © (2008-06-04 11:38) [7]
> IF EXISTS (SELECT * FROM Deleted) -- Вот это интересно не
> лишнее будет ?
нет, поскольку триггер у тебя для
> FOR INSERT, UPDATE, DELETE
← →
wicked © (2008-06-04 11:39) [8]то есть - нет, не лишнее :)
ибо
есть Inserted, нет Deleted - у нас insert
есть Inserted, есть Deleted - у нас update
нет Inserted, есть Deleted - у нас delete
← →
Ega23 © (2008-06-04 11:39) [9]Если по логике смотреть, то вроде как лишнее...
← →
Ega23 © (2008-06-04 11:40) [10]
> ибо
> есть Inserted, нет Deleted - у нас insert
> есть Inserted, есть Deleted - у нас update
> нет Inserted, есть Deleted - у нас delete
Четвёртого-то варианта (нет inserted, нет deleted) - нету...
← →
wicked © (2008-06-04 11:42) [11]
> Четвёртого-то варианта (нет inserted, нет deleted) - нету.
> ..
да я уже увидел, что там deleted два раза отрабатывается
не внимательный :)
← →
андр. (2008-06-04 11:46) [12]
> wicked © (04.06.08 11:38) [7]
Ну если триггер срабатывает приINSERT, UPDATE, DELETE
, тогда получается если нет таблицыInserted
, тогда полюбому есть таблицаDeleted
, и проверка вроде
ELSE
IF EXISTS (SELECT * FROM Deleted) -- Вот это интересно не лишнее будет ?
BEGIN
--Удаление записи
END
становится какбы лишняя, потомучто триггер UPDATE срабатывает непосредственно при имеющихся таблицахInserted
иDeleted
(То что было
ито что стало
)
Или я неправ, и конструкцию вида:ELSE
IF EXISTS (SELECT * FROM Deleted) -- Вот это интересно не лишнее будет ?
BEGIN
--Удаление записи
END
всеже тучше оставить, так сказать на всякий-який... ???
← →
Ega23 © (2008-06-04 11:49) [13]Мне тут вот чё непонятно: нафига на Update? Что это за лог такой, который апдейтить можно?
← →
wicked © (2008-06-04 11:50) [14]> андр. (04.06.08 11:46) [12]
говорю ж - не доглядел
хорошо там у тебя, условие можно убрать
← →
андр. (2008-06-04 11:53) [15]
> Ega23 © (04.06.08 11:49) [13]
Не, не это я просто конструкцию поставил такую для примера, а так триггер в других таблицах использоваться будет....
Можно конечно использовать тригер и на таблице логов следующим образомЖCREATE TRIGGER [trgLog] ON [dbo].[tLog]
FOR INSERT, UPDATE, DELETE
AS
DECLARE
@IdLog int
IF EXISTS (SELECT * FROM Inserted)
BEGIN
IF NOT EXISTS (SELECT * FROM Deleted)
BEGIN
--Вставка записи
END
ELSE
BEGIN
--Обновление записи
ROLLBACK
END
END
ELSE
IF EXISTS (SELECT * FROM Deleted) -- Вот это интересно не лишнее будет ?
BEGIN
--Удаление записи
ROLLBACK
END
:o)
← →
андр. (2008-06-04 12:01) [16]
> Ega23 © (04.06.08 11:49) [13]
Извини, так что посоветуешь. Убрать конструкцию:ELSE
IF EXISTS (SELECT * FROM Deleted) -- Вот это интересно не лишнее будет ?
BEGIN
--Удаление записи
ROLLBACK
END
или оставить на всякий-який ?
← →
Ega23 © (2008-06-04 12:02) [17]Честно - не знаю. Наверное убрать. Но - помнить, что убрал. :)
← →
андр. (2008-06-04 12:04) [18]
> Ega23 © (04.06.08 12:02) [17]
Спс. :o)
← →
андр. (2008-06-04 14:18) [19]Сорри возвращаюсь к теме...
В нутри этого же триггера, необходимо добавить блокировки на добавления вtLog
, для того чтобы, если уменя логиррование происходит в тригеррах например двух или трех таблиц одновременно, чтоб просто ставил в ожидание. Ну это говарю еще раз для исключения ошибок одновременного добавления в таблицуtLog
. Посоветуйте "кодом" как это реализовать транзакциями.
Заранее огромное спасибо !
Вот шаблон:CREATE TRIGGER [trgLog] ON [dbo].[tLog]
FOR INSERT, UPDATE, DELETE
AS
DECLARE
@IdLog int
IF EXISTS (SELECT * FROM Inserted)
BEGIN
IF NOT EXISTS (SELECT * FROM Deleted)
BEGIN
--Вставка записи
--Может сюда что-то типа OPEN TRANSACTION
--Что-то делаем
--А сюда что-то типа CLOSE TRANSACTION
--???
END
ELSE
BEGIN
--Обновление записи
ROLLBACK
END
END
ELSE
IF EXISTS (SELECT * FROM Deleted) -- Вот это интересно не лишнее будет ?
BEGIN
--Удаление записи
ROLLBACK
END
← →
андр. (2008-06-04 14:50) [20]???
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.07.20;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.047 c