Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
SamMan
Согласен, это вроде как подтверждает ваш посыл, НО:

USE master
go
CREATE DATABASE XXCX
go
USE XXCX
go
create table t(id int)
go
create proc test1 as
BEGIN
	PRINT 'EEE'
	alter table t drop constraint pk_t1
END
go
EXEC test1
go
--clean up
USE master
go
DROP DATABASE XXCX



О том что НЕ существующий констрейнт нельзя дропнуть уж тем более можно было "прочухать" на этапе компиляции? Не "прочухивает" - отправляет на исполнение.


И - да, показанный пример еще, до кучи, вступает в "клинч" с
BOL
Отложенное разрешение имен можно использовать только для объектов несуществующих таблиц. Остальные объекты должны существовать при создании хранимой процедуры.

pk_t1 является НЕ существующим объектом СУЩЕСТВУЮЩЕЙ таблицы. Согласно отквоченному такая конструкция должна просто "сшибаться на лету" с формулировкой навроде вами упомянут несуществующий объект. Не сшибается. И компилируется. И даже исполняется. Спасибо хоть на исполнении "семафорит" ошибкой...
30 мар 12, 12:53    [12339588]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
beg_inner
Guest
он дроп вообще не проверяет.
вот такое тоже компилируется:

alter proc a.test1 as
    drop table любая_несуществующая_таблица
30 мар 12, 12:56    [12339629]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
beg_inner
Guest
Don’t trust SQL Server 2005 “Deferred Name Resolution”
30 мар 12, 13:04    [12339702]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Ложно. Как минимум НЕ верно на 100%.

а я и не утверждаю, что проверка всеобъемлющая.
что-то отлавливается, что-то нет.

> Как так получается, что SQL-компилятор ХПшек иногда "очень умный", а иногда...

а вот так вот и получается.
надо просто знать, что перед выполнением процедура полностью компилируется и при
этом происходит ряд проверок, связанных в том числе и со схемой данных.

Posted via ActualForum NNTP Server 1.5

30 мар 12, 13:12    [12339786]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> И - да, показанный пример еще, до кучи, вступает в "клинч" с
> BOL

ну, пожалуйтесь:
http://connect.microsoft.com/SQLServer/

об ответе на это, я, впрочем, смутно догадываюсь.

Posted via ActualForum NNTP Server 1.5

30 мар 12, 13:20    [12339852]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
beg_inner
Guest
daw,
уже жаловались и тут ссылки на connect даны

http://us.generation-nt.com/answer/deferred-name-resolution-compilation-help-125205181.html#r
30 мар 12, 13:23    [12339886]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

по первой ссылке товарищ как-то странно интерпретирует отложенность.
разрешение, конечно же, происходит именно перед
выполнением (компиляцией) соответствующего стейтмента, а не процедуры.
как иначе предполагалось бы работать с временными таблицами, создаваемыми
внутри процедуры?

по второй ссылке - а на кой проверять корректность для стейтмента, проверка
которого все равно откладывается до момента выполнения?

Posted via ActualForum NNTP Server 1.5

30 мар 12, 13:47    [12340070]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
beg_inner
Guest
daw,

во второй в ответе товарищу были ссылки на connect,
это было к тому, что уже жаловались
30 мар 12, 13:51    [12340117]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
По ходу, лищний раз убеждаюсь, что BOL пишут не Боги. Далеко НЕ.
Про Коннект - даже не смешите. Последний мой фид (на чистом английском и снабженный воспроизводимым примером) 2 месяца весит в "Активных" с единственным комментом: "Спасибо, мы разберемся". Полагаю они просто не могут врубиться в суть моего вопроса (он и правда, уж очень "тонок"). Но все же - это ж "авторы", так сказать! Кто же если не они?
30 мар 12, 14:34    [12340407]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
daw
> Ложно. Как минимум НЕ верно на 100%.

а я и не утверждаю, что проверка всеобъемлющая.
что-то отлавливается, что-то нет.


Я понимаю, что "вот так оно есть" и "зачем ваши стоны". Я все это понимаю. Но, переводя беседу уже в несколько академическое русло, разве ВОТ ЭТО - хорошо? Разве невозможно описать четко алгоритм проверки текста ХП "на входе"? Он настолько безумно сложен что его описание растянется на 5 экранов 7-м шрифтом? Типа - сомневаюсь... Обычные недоработки, с которыми можно мириться. Но лучше - исправлять!
30 мар 12, 14:39    [12340455]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
daw
и при этом происходит ряд проверок, связанных в том числе и со схемой данных.


"...и ряд этот странен, не понятен, а местами нелогичен. До кучи, он (точнее методика его формирования) не расписан хоть с какой-то приемлемой степенью подробности". Дополнил бы я, что бы никто никаких иллюзий не питал.
30 мар 12, 14:44    [12340490]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
beg_inner
Guest
у меня снова какие-то загадочности с кодом,
и снова не могу воспроизвести.
ситуация: процедура имеет вид
begin try
    ...
    commit
 end try

begin catch
   rollback
   insert into log
end catch

и вот когда обнаруживается нарушение ПК, и его невозможно создать,
попадаем в catch.
по идее сперва роллбэк, потом в лог пишется номер ошибки.
именно после роллбэка пишется.
иду в лог: ничего не записалось.
хорошо, после роллбэка вставляю принт ошибки, и принт печатает!
тогда выдираю этот кусок из процедуры, запускаю отдельно,
о, чудо.
в лог пишется.
роллбэк происходит и в процедуре, и в выдранном коде.
@@trancount дает 0.
никак не пойму, почему в процедуре в лог не пишется?

P.S. есть аналогичная процедура,
абсолютно та же структура.
однажды кое-кто отнял права на таблицы из процедуры,
так зашло в catch, сделало роллбэк и в лог записало.
почему то пишет в лог , то не пишет?
27 апр 12, 17:52    [12481754]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
beg_inner
почему то пишет в лог , то не пишет?
Потому что у вас ошибка в коде.
27 апр 12, 17:54    [12481764]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
beg_inner
Guest
Гавриленко Сергей Алексеевич,

так я же код не меняю.
я его выдергиваю из процедуры и запускаю отдельно. и все пишет.
в коде ошибка или есть, или нет.
если есть, то как же выдранный код работает?
ведь это тот же самый код
27 апр 12, 18:01    [12481795]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Может быть уже код покажете, желательно репро?
27 апр 12, 18:08    [12481836]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
beg_inner
Guest
Гавриленко Сергей Алексеевич,

не знаю, всю процедуру что-ли сюда выложить?
если выдергиваю тот кусок и только тот кусок оформляю как процедуру, он в лог пишет тоже.
а вся процедура, как доходит до этого места, делает роллбэк, но в лог не пишет.
добавлять что-ли к этому работающему куску все что еще до этого, пока не воспроизведется?
27 апр 12, 18:29    [12481948]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
beg_inner,

Наличие таблицы log гарантируется "до того как"? А вообще согласен, без какого-нибудь вменяемого кода обсуждение вряд ли будет конструктивным...
27 апр 12, 18:32    [12481963]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
beg_inner
Guest
вот. ужала как могла.
копировала кусками и не скопировала предварительный drop table,
и теперь ошибка воспроизводится еще до навешивания ключа.
всего-то идет select into,
запись об этом идет в лог и в табличную переменную (но до этого дело не доходит)
потом запись о роллбэке идет также в лог и в переменную,
после роллбэка переписываю из переменной в лог -- и это прокатывает.
а следующий инсерт в лог НЕ ИДЕТ.
и если бы не запись из переменной, в логе бы ни одной записи не было бы.
а так вместо двух одна (я в переменную стала потом писать. без переменной записей в логе просто 0)

alter proc staging.test as

begin tran

begin try

declare @log table
(
	id int,
	tipo tinyint,
	data_rif datetime,
	id_data int,
	datainizio datetime,
	datafine datetime,
	ambiente varchar,
	programma varchar(50),
	istruzione nvarchar(max),
	errore int,
	righe int,
	nota nvarchar(max),
	risultato int
);

declare @nome_sp char(50)
declare @id_data int = 12345
DECLARE @DATA_RIF datetime
declare @InitDateLOG  datetime = getdate()
declare @tipo_data int  --1=inizio mese, 2= fine mese 0=altro
set @nome_sp='staging.test'
--!!!!===============================================================================================================!!!!

SELECT   
	12345 as id_data,
	R.NUM_PRAT, 
	R.BB10_IDBANCA, 
	R.NDG, 
	R.BB10_IDRAPPORTO, 
	R.dataricman, 
	R.[Data Scadenza Rapporto], 
	R.[Anzianita Rapporto], 
	P.[Tipologia Credito]

into BASEDATI_BI.staging.TAB_Anzianita_rapporto_CC_T

FROM basedati_bi.staging.TAB_RAPPORTI_T as R
     INNER JOIN
     basedati_bi.staging.TAB_Portafoglio_T as P
     ON R.BB10_IDBANCA = P.BB20_IDBANCA
WHERE (R.dataricman IS NOT NULL) 
  AND (R.[Data Scadenza Rapporto] IS NOT NULL) 
  AND (P.COD_TC = 1);
--
 
insert into BASEDATI_BI.staging.LOG_T(tipo, datainizio, datafine, programma, istruzione, errore, RIGHE, data_rif, id_data)
output
 inserted.id, inserted.tipo, inserted.datainizio, inserted.datafine, inserted.programma, 
 inserted.istruzione, inserted.errore, inserted.RIGHE, inserted.data_rif, inserted.id_data 
 into @log (id, tipo, datainizio, datafine, programma, istruzione, errore, RIGHE, data_rif, id_data)
values (1,@InitDateLOG, getdate(), @nome_sp,  'select into TAB_Anzianita_rapporto_CC_T', 0, @@rowcount, @DATA_RIF, @id_data)

--!!!!===============================================================================================================!!!!

commit;
end try

begin catch
    select @InitDateLOG = getdate(); 
    
insert into BASEDATI_BI.staging.LOG_T(tipo, datainizio, datafine, programma, istruzione, errore, RIGHE, data_rif, id_data, nota)
output
 inserted.id, inserted.tipo, inserted.datainizio, inserted.datafine, inserted.programma, 
 inserted.istruzione, inserted.errore, inserted.RIGHE, inserted.data_rif, inserted.id_data 
 into @log (id, tipo, datainizio, datafine, programma, istruzione, errore, RIGHE, data_rif, id_data)
 values (1,@InitDateLOG, getdate(), @nome_sp,  @nome_sp + ': transaction rolled back', error_number(), @@rowcount, @DATA_RIF, @id_data, error_message());

	rollback;	
	
set identity_insert BASEDATI_BI.staging.LOG_T on;
	
	insert into BASEDATI_BI.staging.LOG_T ( id, tipo, datainizio, datafine, programma, istruzione, errore, RIGHE, data_rif, id_data, nota)
    select id, tipo, datainizio, datafine, programma, istruzione, errore, RIGHE, data_rif, id_data, nota 
    from @log;
            
set identity_insert BASEDATI_BI.staging.LOG_T off;

	insert into BASEDATI_BI.staging.LOG_T( tipo, datainizio, datafine, programma, istruzione, errore, RIGHE, data_rif, id_data, nota)
	values (1,@InitDateLOG, getdate(), @nome_sp,  @nome_sp + ': transaction rolled back', error_number(), @@rowcount, @DATA_RIF, @id_data, error_message());
end catch
27 апр 12, 18:48    [12482013]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3754
SamMan
daw
и при этом происходит ряд проверок, связанных в том числе и со схемой данных.


"...и ряд этот странен, не понятен, а местами нелогичен. До кучи, он (точнее методика его формирования) не расписан хоть с какой-то приемлемой степенью подробности". Дополнил бы я, что бы никто никаких иллюзий не питал.

ДА! Именно так и есть. И потому имхо компиляция вообще смысла большого не имеет.
27 апр 12, 18:49    [12482014]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
beg_inner
Guest
SamMan
beg_inner,

Наличие таблицы log гарантируется "до того как"? А вообще согласен, без какого-нибудь вменяемого кода обсуждение вряд ли будет конструктивным...


да, таблица лога на месте и до и после.
27 апр 12, 18:49    [12482017]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
beg_inner
Guest
делаю то же самое с другой существующей таблицей: в нее селект инто, роллбэк и запись в лог, так все записывается.
все это засовываю в процедуру и снова записывается (таблица-лог та же самая).
а вот именно с этой таблицей из длинного кода инсерт после роллбэка не пишется
27 апр 12, 18:56    [12482030]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
beg_inner,

Ну, код, формально, теперь есть, но это не шибко помогает беседе.

1. Какая ошибка валится? Текст ее?
2. Где она валится? На какой строке?
3. Проблему вызывает таблица BASEDATI_BI.TAB_Anzianita_rapporto_CC_T? Если да - зачем в коде фигурирует таблица BASEDATI_BI.LOG_T?
4. Если наоборот - то зачем наоборот?
5. Структуры таблиц какие?

В общем, без ЗАПУСКАБЕЛЬНОГО примера как-то это все не очень...
27 апр 12, 21:27    [12482274]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Какой результат возвратит функция xact_state() на входе в блок catch в проблемной процедуре?
27 апр 12, 22:10    [12482392]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
beg_inner
Guest
SamMan,

в понедельник выложу все подробности.
по памяти:
1.
сейчас выходит ошибка о том, что невозможно создать TAB_Anzianita_rapporto_CC_T,
потому что уже существует BASEDATI_BI.staging.TAB_Anzianita_rapporto_CC_T.
только потому, что забыла скопипастить DROP TABLE перед SELECT INTO.

а до этого ошибка была, что невозможно создать ПК.
пара ошибок: первая говорит про ПК, а вторая "1750: невозможно создать констрейнт, см. предыдущую ошибку"

2. сейчас в строке с SELECT INTO,
а было на строке с ALTER TABLE BASEDATI_BI.staging.TAB_Anzianita_rapporto_CC_T ADD CONSTRAINT.

3. Проблему вызывает таблица BASEDATI_BI.TAB_Anzianita_rapporto_CC_T.
BASEDATI_BI.LOG_T это лог, в который НЕ ПИШЕТСЯ после роллбэк.

попробовала создать аналогичную процедуру с записью в тот же лог,
где делается SELECT INTO в уже имеющуюся таблицу. так записывается ERROR в лог после роллбэка!
это-то и странно, какая же разница, в какую таблицу делать SELECT INTO,
в обоих случаях таблица существует и SELECT INTO валится.
в одном случае пишется в лог, в другом нет smile:CRAZY

5. структура лога абсолютно как в табличной переменной @log:

(
	id int,
	tipo tinyint,
	data_rif datetime,
	id_data int,
	datainizio datetime,
	datafine datetime,
	ambiente varchar,
	programma varchar(50),
	istruzione nvarchar(max),
	errore int,
	righe int,
	nota nvarchar(max),
	risultato int
)


только в таблице лога ID IDENTITY и tipo NOT NULL

invm,
xact_state() вставлю тоже в понедельник и отпишусь.
хотя он мне в обоих случаях красным писал, точный текст не помню, но было ясно,
что стало uncommitable, прямо так и писал, делайте rollback.
и роллбэк делался, только с последующим инсертом проблемы.
27 апр 12, 22:36    [12482489]     Ответить | Цитировать Сообщить модератору
 Re: что-то не то с Cannot define PRIMARY KEY constraint on nullable column  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
beg_inner,

Вот если xact_state() возвращает -1, т.е. транзакция находится в нефиксируемом состоянии, то любые операции, влекущие за собой запись в журнал, запрещены. Следовательно ваш
insert into BASEDATI_BI.staging.LOG_T(tipo, datainizio, datafine, programma, istruzione, errore, RIGHE, data_rif, id_data, nota)
output
 inserted.id, inserted.tipo, inserted.datainizio, inserted.datafine, inserted.programma, 
 inserted.istruzione, inserted.errore, inserted.RIGHE, inserted.data_rif, inserted.id_data 
 into @log (id, tipo, datainizio, datafine, programma, istruzione, errore, RIGHE, data_rif, id_data)
 values (1,@InitDateLOG, getdate(), @nome_sp,  @nome_sp + ': transaction rolled back', error_number(), @@rowcount, @DATA_RIF, @id_data, error_message());
не выполняется.
27 апр 12, 22:49    [12482530]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить