Есть таблица в 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 дает пустую страницу, а не везвращает сообщение об ошибке?
Constraint в txn под ASP не срабатывает
Автор glnt, 11.02.2005, 15:37
#2
Отправлено 11.02.2005, 16:12:58
Знаеш может быть при вызове процедуры на странице , она может завершиться после первого инсерта.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
Количество пользователей, читающих эту тему: 1
пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0