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

Откуда:
Сообщений: 1497
Здравствуйте.
Есть такая проблема, помогите найти, откуда ноги растут:
В процедуре используется олицетворение:
WITH EXECUTE AS 'User_B'


В ней же создаются временные таблицы, при создании которых не указывается явное разрешение вставлять в столбцы Null:
CREATE TABLE #T (keyP int, wop smallint)


Теперь, если я запускаю эту процедуру от имени User_A (для которого она и делается и у который сильно ограничен в правах), то таблица #T не заполняется, если я её попытаюсь заполнить такой инструкцией
INSERT INTO #T (keyP)
SELECT ........ FROM ......

и процедура не отрабатывает всего чего мне нужно.

Однако же, если я запущу эту процедуру от имени пользователя User_B, то все выполнится без проблем, таблица заполнится и в поле wop добавится значение Null.

Проблема решается созданием таблицы с явным указанием NULL
CREATE TABLE #T (keyP int, wop smallint NULL)


Когда база была на SQLExpress 2008R2 - все отрабатывало отлично. Отхватил такую проблему при переносе на
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1777.0 (X64) Apr 8 2011 14:16:38 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7600: )

Как от неё избавиться? Уж очень не хочется лопатить все вызываемые из процедуры из этой хранимки.....

---------------------------------
http://ag-vba.ucoz.ru/ - сервис распознавания капчи теперь и для VBA!!!
13 сен 13, 22:47    [14838698]     Ответить | Цитировать Сообщить модератору
 Re: Олицетворение + временные таблицы=не вставляется Null  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Подсказка:
+ tempdb ansi_null_default off
alter database tempdb set ansi_null_default off;
go

set ansi_null_dflt_on off;
go

create table #t (i int, v int);
go

insert into #t (i) values (1);
go

drop table #t;
go

set ansi_null_dflt_on on;
go

create table #t (i int, v int);
go

insert into #t (i) values (1);
go

drop table #t;
go

+ tempdb ansi_null_default on
alter database tempdb set ansi_null_default on;
go

set ansi_null_dflt_on off;
go

create table #t (i int, v int);
go

insert into #t (i) values (1);
go

drop table #t;
go

set ansi_null_dflt_on on;
go

create table #t (i int, v int);
go

insert into #t (i) values (1);
go

drop table #t;
go
13 сен 13, 23:17    [14838807]     Ответить | Цитировать Сообщить модератору
 Re: Олицетворение + временные таблицы=не вставляется Null  [new]
Диам
Member

Откуда:
Сообщений: 1497
invm,
спасибо.
Но почему для одного пользователя tempdb ansi_null_default ON, а для другого tempdb ansi_null_default OFF ?
14 сен 13, 00:10    [14839011]     Ответить | Цитировать Сообщить модератору
 Re: Олицетворение + временные таблицы=не вставляется Null  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Диам
invm,
спасибо.
Но почему для одного пользователя tempdb ansi_null_default ON, а для другого tempdb ansi_null_default OFF ?

ansi_null_default одинаков для обоих пользователей, т.к. это настройка БД.
Проверьте настройки сессии, а именно ansi_null_dflt_on, ansi_null_dflt_off.
14 сен 13, 15:56    [14839782]     Ответить | Цитировать Сообщить модератору
 Re: Олицетворение + временные таблицы=не вставляется Null  [new]
Диам
Member

Откуда:
Сообщений: 1497
Гость333,
спасибо за наводку. Вероятно, именно в сессии и есть проблема. Вот и выписка из BOL:
При соединении с драйвером ODBC для собственного клиента SQL Server или поставщика OLE DB для собственного клиента SQL Server для SQL Server параметр ANSI_NULL_DFLT_ON автоматически устанавливается в ON. Значение SET ANSI_NULL_DFLT_ON для соединений из приложений DB-Library по умолчанию равно OFF.
15 сен 13, 00:34    [14840737]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить