Сведения о вопросе

Математик

00:13, 8th August, 2020

Теги

sql-server    

SQL сервер 2005 триггер Insert не вводить достаточное количество записей

Просмотров: 447   Ответов: 4

У меня есть таблица в базе данных SQL Server 2005 с триггером, который должен добавлять запись в другую таблицу всякий раз, когда вставляется новая запись. Это, кажется, работает нормально, но если я выполняю Insert Into в главной таблице, которая использует подзапрос в качестве источника значений, триггер вставляет только одну запись в другую таблицу, даже если в главную было добавлено несколько записей. Я хочу, чтобы триггер срабатывал для каждой новой записи, добавленной в главную таблицу. Возможно ли это в 2005 году?

Вставка, которую я делаю, это:

INSERT INTO [tblMenuItems] ([ID], [MenuID], [SortOrder], [ItemReference], [MenuReference], [ConcurrencyID]) SELECT [ID], [MenuID], [SortOrder], [ItemReference], [MenuReference], [ConcurrencyID] FROM [IVEEtblMenuItems]

Вот как выглядит триггер:

CREATE TRIGGER [dbo].[tblMenuItemInsertSecurity] ON [dbo].[tblMenuItems] 
FOR INSERT
AS

Declare @iRoleID int
Declare @iMenuItemID int

Select @iMenuItemID = [ID] from Inserted

DECLARE tblUserRoles CURSOR FASTFORWARD FOR SELECT [ID] from tblUserRoles
OPEN tblUserRoles 
FETCH NEXT FROM tblUserRoles INTO @iRoleID 

WHILE (@@FetchStatus = 0)
  BEGIN
    INSERT INTO tblRestrictedMenuItems(
      [RoleID],
      [MenuItemID],
      [RestrictLevel])

      VALUES(
      @iRoleID,
      @iMenuItemID,
      1)    

    FETCH NEXT FROM tblUserRoles INTO @iRoleID 
  END

CLOSE tblUserRoles 
Deallocate tblUserRoles



  Сведения об ответе

prince

08:50, 9th August, 2020

Ваш триггер использует только первую строку из 'Inserted'. Это распространенное недоразумение, когда мы впервые имеем дело с триггерами SQL. Триггер срабатывает на обновление, а не на строку.

Например, если вы выполните следующие действия:-

обновление продуктов название набора = 'geoff de geoff'

это приведет к обновлению всех продуктов, но триггер в таблице продуктов сработает только один раз.

Вставленный 'table', который вы получаете в триггере, будет содержать все строки. Вы должны либо выполнить цикл через вставленный курсором, либо лучше присоединиться к вставленной таблице, которую вы обновляете.


  Сведения об ответе

VCe znayu

22:19, 2nd August, 2020

Пожалуйста, посмотрите многорядное рассмотрение триггеров что происходит с курсором внутри триггера? Узнайте, как программировать набор на основе, курсоры являются злом в T-SQL и должны использоваться только для дефрагментации / обновления статистики/другого обслуживания куча таблиц


  Сведения об ответе

PHPH

13:50, 15th August, 2020

Триггер срабатывает только один раз для каждого выполненного состояния INSERT - не один раз для каждой вставленной записи.

В своем триггере вы можете получить доступ к таблице 'virtual' с именем inserted для получения подробной информации о вставленных записях.

т.е.:

SELECT COUNT(*) FROM inserted 

Возвращает количество вставленных записей.


  Сведения об ответе

ЯЯ__4

01:46, 26th August, 2020

Я просто хочу, чтобы второй звонок @Gordon был на его ответе...

"Catch" значения в тот самый момент, когда они вставляются. Вам действительно не нужен курсор в этой ситуации (или, может быть, у вас есть причина?).

Простой TRIGGER может быть все, что вам нужно:

http://dbalink.wordpress.com/2008/06/20/how-to-sql-server-trigger-101 /


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться