Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ошибка в триггере instead of insert  [new]
Dmitry K.
Member

Откуда:
Сообщений: 146
Доброго времени суток всем. Никак не могу победить ошибку и очень надеюсь на помощь!
MS SQL Server Express 2005.
Имеется таблица:
CREATE TABLE [dbo].[COMPETITORS](
	[IDCOMPETITOR] [bigint] IDENTITY(1,1) NOT NULL,
	[NAMECOMPETITOR] [nvarchar](150)  NOT NULL,
	[COMPANYPHONE] [nvarchar](50) NULL,
	[EMAIL] [nvarchar](100) NULL,
	[URL] [nvarchar](150) NULL,
	[COUNTRY] [nvarchar](50) NULL,
	[STATE] [nvarchar](150) NULL,
	[CITY] [nvarchar](100) NULL,
	[STREET] [nvarchar](100) NULL,
	[ZIP] [nvarchar](6) NULL,
	[DESCRIPTION] [ntext] NULL,
	[HEADACCOUNT] [bigint] NULL,
	[HEADCOMPETITOR] [bigint] NULL,
	[STRENGTHS] [ntext] NULL,
	[WEAKNESSES] [ntext] NULL,
	[OPPORTUNITIES] [ntext] NULL,
	[THREATS] [ntext] NULL,
	[CREATEDATE] [datetime] NOT NULL CONSTRAINT [DF__CRM_OP_CO__CREAT__182C9B23]  DEFAULT (getdate()),
	[IDOWNER] [bigint] NOT NULL,
	[CHANGEDATE] [datetime] NULL,
	[CHANGEUSER] [bigint] NULL,
	[FIELD1] [sql_variant] NULL,
	[FIELD2] [sql_variant] NULL,
	[FIELD3] [sql_variant] NULL,
	[FIELD4] [sql_variant] NULL,
	[FIELD5] [sql_variant] NULL,
 CONSTRAINT [PK_CRM_OP_COMPETITORS] PRIMARY KEY CLUSTERED 
(
	[IDCOMPETITOR] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO
Доступ к этой таблице запрещен всем пользователям, а для модификации данных используется представление, в котором выбираются строки на основе ACL.
Для модификации данных используются instead of триггеры.
Триггер instead of update работает исправно и с ним проблем нет.
Триггер на вставку записи такой:
ALTER TRIGGER [dbo].[V_COMPETITORS_INSERT] ON [dbo].[V_COMPETITORS]
WITH EXECUTE AS CALLER
INSTEAD OF INSERT
AS
SET NOCOUNT ON
DECLARE  @IDUSER bigint

BEGIN TRY
	EXECUTE AS CALLER

	SELECT @IDUSER = dbo.GETCURRUSER()
	
	IF @IDUSER = -1
		RAISERROR('Unauthorized access!', 12, 1)
	
	INSERT INTO [crm].[dbo].[CRM_OP_COMPETITORS]
           ([NAMECOMPETITOR]
           ,[COMPANYPHONE]
           ,[EMAIL]
           ,[URL]
           ,[COUNTRY]
           ,[STATE]
           ,[CITY]
           ,[STREET]
           ,[ZIP]
           ,[DESCRIPTION]
           ,[HEADACCOUNT]
           ,[HEADCOMPETITOR]
           ,[STRENGTHS]
           ,[WEAKNESSES]
           ,[OPPORTUNITIES]
           ,[THREATS]
           ,[CREATEDATE]
           ,[IDOWNER]
           )
	SELECT
	    [NAMECOMPETITOR]
           ,[COMPANYPHONE]
           ,[EMAIL]
           ,[URL]
           ,[COUNTRY]
           ,[STATE]
           ,[CITY]
           ,[STREET]
           ,[ZIP]
           ,[DESCRIPTION]
           ,[HEADACCOUNT]
           ,[HEADCOMPETITOR]
           ,[STRENGTHS]
           ,[WEAKNESSES]
           ,[OPPORTUNITIES]
           ,[THREATS]
	   ,GETDATE()
           ,@IDUSER
	FROM inserted
		
END TRY
BEGIN CATCH
    DECLARE @ErrorMessage NVARCHAR(400);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;
    SELECT @ErrorMessage = ERROR_MESSAGE();
    SELECT @ErrorSeverity = ERROR_SEVERITY();
    SELECT @ErrorState = ERROR_STATE();
	
	IF @@TRANCOUNT > 0
		ROLLBACK
    RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH

При попытке вставки записи и последующего COMMIT, возникает ошибка:
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.

Почему такое может быть???
Буду очень признателен за полезный совет!
4 ноя 09, 15:57    [7881535]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере instead of insert  [new]
Glory
Member

Откуда:
Сообщений: 104760
Dmitry K.

При попытке вставки записи и последующего COMMIT, возникает ошибка:


И где полный скрипт этой "попытки вставки" ?
4 ноя 09, 16:00    [7881547]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере instead of insert  [new]
Dmitry K.
Member

Откуда:
Сообщений: 146
Сорри, вот
insert into v_competitors (namecompetitor) values ('fff')
commit
4 ноя 09, 16:01    [7881550]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере instead of insert  [new]
Glory
Member

Откуда:
Сообщений: 104760
Dmitry K.
Сорри, вот
insert into v_competitors (namecompetitor) values ('fff')
commit

Ну и где же тут BEGIN TRANSACTION, про которую вам сервер и написал сообщение ?
4 ноя 09, 16:03    [7881558]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере instead of insert  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36807
Dmitry K.
Сорри, вот
insert into v_competitors (namecompetitor) values ('fff')
commit
Ну, вам в ошибке английским по белому написали, что у вас есть commit, и нету begin transaction. Купите уже словарик, я не знаю.
4 ноя 09, 16:03    [7881559]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере instead of insert  [new]
Dmitry K.
Member

Откуда:
Сообщений: 146
Читать я умею и еще понимаю, что как раз транзакция то должна автоматически открываться во время вставки записи
4 ноя 09, 16:05    [7881565]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере instead of insert  [new]
Glory
Member

Откуда:
Сообщений: 104760
Dmitry K.
Читать я умею и еще понимаю, что как раз транзакция то должна автоматически открываться во время вставки записи

Она и открывается. И потом закрывается. Все автоматически.
4 ноя 09, 16:05    [7881567]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере instead of insert  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36807
Dmitry K.
Читать я умею и еще понимаю, что как раз транзакция то должна автоматически открываться во время вставки записи
Угу. Она же еще автоматически там и закрывается, если другого не указано.

Сообщение было отредактировано: 4 ноя 09, 16:06
4 ноя 09, 16:06    [7881568]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере instead of insert  [new]
Dmitry K.
Member

Откуда:
Сообщений: 146
Хммм....т.е. в отличии от Oracle, мне не надо делать commit после вставки записи?
Буду знать!
Однако, после insert (убрал commit!), последующий select показывает те же записи, что и были до него, т.е. запись не вставляется, при этом ошибок никаких не выдается
4 ноя 09, 16:08    [7881579]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере instead of insert  [new]
Glory
Member

Откуда:
Сообщений: 104760
Dmitry K.
Хммм....т.е. в отличии от Oracle, мне не надо делать commit после вставки записи?
Буду знать!
Однако, после insert (убрал commit!), последующий select показывает те же записи, что и были до него, т.е. запись не вставляется, при этом ошибок никаких не выдается

- autocommit регулируется настройкой SET IMPLICIT_TRANSACTIONS
- если ошибок нет, то значит именно так и работает ваш триггер
4 ноя 09, 16:10    [7881583]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере instead of insert  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36807
Последующий селект откуда? Вы так и будете партизанить, или все таки начнете сопровождать свои заключения кодом?
4 ноя 09, 16:12    [7881591]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере instead of insert  [new]
Dmitry K.
Member

Откуда:
Сообщений: 146
Вынужден признать, что, видимо, сегодня я тормоз, проблем вообще никаких не было, данные корректно вставлялись в таблицу, во вьюхе же не был прописан left outer join на одну из связанных таблиц, в следствии чего, соответствующие данные не показывались. А сбил меня со следа пресловутый commit ;-)))
Всем спасибо за то, что вывели меня из интеллектуального оцепенения.
4 ноя 09, 16:26    [7881657]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере instead of insert  [new]
Dmitry K.
Member

Откуда:
Сообщений: 146
Если быть точным, даже не join был причиной, а ACL, в котором не были прописаны разрешения на вставляемую. запись ))))
4 ноя 09, 16:34    [7881701]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере instead of insert  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
А [dbo].[V_COMPETITORS] создавалась с опцией WITH VIEW_METADATA?
Если нет, советую это туда добавить. Некоторые компоненты доступа к данным (особенно производства Microsoft) иногда
демонстрируют свой "искусственный интеллект": они обращаются к таблице напрямую, хотя в запросе указано представление.
С игнорированием триггеров INSTEAD OF этого представления, разумеется.
4 ноя 09, 16:44    [7881739]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере instead of insert  [new]
Dmitry K.
Member

Откуда:
Сообщений: 146
Да, с этой опцией!
4 ноя 09, 16:51    [7881766]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить