Перейти к содержимому

Фотография

Constraint в txn под ASP не срабатывает


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 2

#1
glnt

glnt
  • Частый гость
  • 51 сообщений
Есть таблица в MS SQL Server 2000
CREATE TABLE [dbo].[Test] (
[Id] [int] IDENTITY (1, 1) NOT NULL ,
[Val] [char] (1) COLLATE Cyrillic_General_CI_AS NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Test] WITH NOCHECK ADD
CONSTRAINT [CK_Test] CHECK ([Val] = 'B' or [Val] = 'A')
GO

и процедура
CREATE Procedure insTest
As
Begin
Begin Tran
Insert Into Test( Val ) Values( 'A' );
Insert Into Test( Val ) Values( 'D' ); -- Вызовет нарушение целостности
Commit
End
GO

В SQL Query Analyzer выполняю
set xact_abort on
exec insTest

в ответ пишет

(1 row(s) affected)

Server: Msg 547, Level 16, State 1, Procedure insTest, Line 6
INSERT statement conflicted with COLUMN CHECK constraint 'CK_Test'. The conflict occurred in database 'IAPA', table 'Test', column 'Val'.

транзакция откатывается, т.е. все ОК.

Под IIS v5.1 имеется test.asp файл
<%@ language="JScript" %>
<html>
<head><title>Test</title></head>
<body>
<%
var conn = Server.CreateObject( "ADODB.Connection" );
conn.Open( "Provider=SQLOLEDB;Data Source=TestSrv\\SQL2000", "test", "test" );
conn.Execute( "Set XAct_Abort On" );

var cmd = Server.CreateObject( "ADODB.Command" );
cmd.ActiveConnection = conn;
cmd.CommandText = "{ call insTest }";
cmd.Execute();
%>
</body>
</html>

Если зайти на http://localhost/test.asp, то в ответ пустая(!) страница. При этом транзакция откатывается, как положено.

Если изменить процедуру на
CREATE Procedure insTest
As
Begin
Begin Tran
Insert Into Test( Val ) Values( 'D' ); -- Вызовет нарушение целостности
Insert Into Test( Val ) Values( 'A' );
Commit
End
GO

т.е. первое выражение приводик к нарушению целостности, то запуск http://localhost/test.asp дает

Не удается отобразить требуемую страницу
...
HTTP 500.100 - Внутренняя ошибка сервера - ошибка ASP
Internet Information Services
...
Технические сведения (для сотрудников службы поддержки)

Тип ошибки:
Microsoft OLE DB Provider for SQL Server (0x80040E2F)
INSERT statement conflicted with COLUMN CHECK constraint 'CK_Test'. The conflict occurred in database 'Test', table 'Test', column 'Val'.
/test.asp, line 20


Тип обозревателя:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

Страница:
GET /test.asp

Время:
11 февраля 2005 г., 14:31:47


Дополнительные сведения:
Веб-узел поддержки корпорации Майкрософт

т.е как положено.

Подскажите почему, когда в процедуре второе выражение приводит к нарушению целостности, то IIS дает пустую страницу, а не везвращает сообщение об ошибке?
  • 0

#2
pauk

pauk
  • Гость
  • 5 сообщений

CREATE Procedure insTest
As
Begin
Begin Tran
Insert Into Test( Val ) Values( 'A' );
Insert Into Test( Val ) Values( 'D' ); -- Вызовет нарушение целостности
Commit
End
GO

Знаеш может быть при вызове процедуры на странице , она может завершиться после первого инсерта.
Попробуй так

CREATE Procedure insTest
As
Begin
SET NOCOUNT ON
Begin Tran
Insert Into Test( Val ) Values( 'A' );
Insert Into Test( Val ) Values( 'D' ); -- Вызовет нарушениецелостности
Commit
SET NOCOUNT OFF
End
GO

Сообщение отредактировал pauk: 11.02.2005, 16:14:05

  • 0

#3
glnt

glnt
  • Частый гость
  • 51 сообщений
pauk
Огромный respect - помогло. Только set nocount on выполню один раз для сеанса, т. к. результаты "задетых" записей не использую.
  • 0


Количество пользователей, читающих эту тему: 1

пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.