Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.044 c
2-1214159152
krot
2008-06-22 22:25
2008.07.20
При нажатии правой кнопки мыши


2-1213792192
ciborg
2008-06-18 16:29
2008.07.20
Как отключить сообщения об эксепшенах?


2-1213774377
lewka-serdceed
2008-06-18 11:32
2008.07.20
Определение нажатия кнопки


15-1212524487
alex-drob
2008-06-04 00:21
2008.07.20
Отличие packed record от record


2-1213678891
Knight
2008-06-17 09:01
2008.07.20
Хранимая процедура





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