Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Удаление таблицы с неверным именем, начинающимся на ##  [new]
romanstr
Member

Откуда:
Сообщений: 10
Когда-то очень давно, вероятно ещё в MS SQL 2000 в базе была создана таблица [dbo].[##TransactionTypes]. Вероятно тогда MS SQL ещё этого не запрещал или не было такого понятия как временные таблицы -- сейчас сложно выяснить историю её появления. Сейчас же при попытке удалить эту таблицу, или даже вывести её содержимое -- ошибка "Cannot drop the table '##TransactionTypes', because it does not exist or you do not have permission."

Таблицу удаётся найти в sys.all_objects:
select top 10 * from sys.all_objects t1 where t1.[name] like '##TransactionTypes'


"name""object_id""principal_id""schema_id""parent_object_id""type""type_desc""create_date""modify_date""is_ms_shipped""is_published""is_schema_published"
"##TransactionTypes""942626401""null""1""0""U ""USER_TABLE""4/1/2000 12:15 PM""4/1/2000 12:15 PM""false""false""false"


Но OBJECT_ID() возвращает NULL
select OBJECT_ID('##TransactionTypes')


Пробовал таблицу drop, rename, truncate всё без толку. Даже select из неё, ясное дело, не делается. Есть ли какой-то способ её удалить, например прямо по object id, может какими-то системным процедурами?
29 апр 15, 11:06    [17579943]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31969
romanstr
Но OBJECT_ID() возвращает NULL
select OBJECT_ID('##TransactionTypes')
А что возвращает OBJECT_NAME?
Владелец у неё точно DBO?
29 апр 15, 11:14    [17580003]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
Glory
Member

Откуда:
Сообщений: 104751
romanstr
Вероятно тогда MS SQL ещё этого не запрещал или не было такого понятия как временные таблицы

Было такое понятие в 2000м
Скорее всего таблицу создали с "нормальным" именем, а потом переименовали
29 апр 15, 11:15    [17580005]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31969
alexeyvg
Владелец у неё точно DBO?
Почему то schema_id=401, странный ИД схемы для dbo...
29 апр 15, 11:19    [17580038]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
romanstr
Member

Откуда:
Сообщений: 10
alexeyvg
romanstr
Но OBJECT_ID() возвращает NULL
select OBJECT_ID('##TransactionTypes')
А что возвращает OBJECT_NAME?
Владелец у неё точно DBO?


SELECT OBJECT_NAME(942626401)


возвращает имя таблицы
##TransactionTypes
29 апр 15, 11:20    [17580041]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31969
romanstr
Когда-то очень давно, вероятно ещё в MS SQL 2000 в базе была создана
Да, а сейчас то у вас какая версия?
29 апр 15, 11:20    [17580053]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31969
romanstr
возвращает имя таблицы
##TransactionTypes
А SELECT SCHEMA_NAME(401)?
29 апр 15, 11:22    [17580063]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
romanstr
Member

Откуда:
Сообщений: 10
alexeyvg,

это парсер CSV на форуме неверно понял ID с запятыми, вот правильная версия

"name""object_id""principal_id""schema_id""parent_object_id""type""type_desc""create_date""modify_date""is_ms_shipped""is_published""is_schema_published"
"##TransactionTypes""942626401""null""1""0""U ""USER_TABLE""4/1/2000 12:15 PM""4/1/2000 12:15 PM""false""false""false"
29 апр 15, 11:26    [17580105]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
romanstr
Member

Откуда:
Сообщений: 10
alexeyvg,

сейчас версия 2008 R2 -- 10.50.1600.1
29 апр 15, 11:28    [17580127]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
iap
Member

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

таблица же не в tempdb находилась?
SELECT * FROM [База].[dbo].[##TransactionTypes]
отработает?
Может, без указания базы сервер лезет в tempdb (из-за ##), а там-то её нет, конечно.
29 апр 15, 11:32    [17580173]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
DROP TABLE [База].[dbo].[##TransactionTypes];
не поможет?
29 апр 15, 11:35    [17580201]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
romanstr
Member

Откуда:
Сообщений: 10
iap,

SELECT * FROM [mybase].[dbo].[##TransactionTypes]


Database name 'mybase' ignored, referencing object in tempdb.
Database name 'mybase' ignored, referencing object in tempdb.
Msg 208, Level 16, State 0, Line 1
Invalid object name '##TransactionTypes'.
29 апр 15, 11:36    [17580208]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
romanstr
Member

Откуда:
Сообщений: 10
iap
DROP TABLE [База].[dbo].[##TransactionTypes];
не поможет?


аналогично
Database name 'mybase' ignored, referencing object in tempdb.
Cannot drop the table '##TransactionTypes', because it does not exist or you do not have permission.
29 апр 15, 11:37    [17580230]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31969
romanstr
Invalid object name '##TransactionTypes'.
Остаётся апдэйтить sys.objects.
Но после 2005-го это можно делать только в режиме Dedicated Administrator Connection :-(
29 апр 15, 11:38    [17580240]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
romanstr
iap,

SELECT * FROM [mybase].[dbo].[##TransactionTypes]


Database name 'mybase' ignored, referencing object in tempdb.
Database name 'mybase' ignored, referencing object in tempdb.
Msg 208, Level 16, State 0, Line 1
Invalid object name '##TransactionTypes'.


А EXEC sp_rename чего говорит?
29 апр 15, 11:55    [17580402]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
romanstr
Member

Откуда:
Сообщений: 10
a_voronin,

No item by the name of '[##TransactionTypes]' could be found in the current database 'mybase', given that @itemtype was input as '(null)'.
29 апр 15, 12:04    [17580519]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
romanstr
Member

Откуда:
Сообщений: 10
alexeyvg
romanstr
Invalid object name '##TransactionTypes'.
Остаётся апдэйтить sys.objects.
Но после 2005-го это можно делать только в режиме Dedicated Administrator Connection :-(


Таким запросом?


update sys.all_objects 
set [name]= 'dc_TransactionTypes_20150429'
where object_id=942626401
29 апр 15, 12:08    [17580552]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
romanstr
a_voronin,

No item by the name of '[##TransactionTypes]' could be found in the current database 'mybase', given that @itemtype was input as '(null)'.


А проверьте точные коды символов в sysobjects и в вашей строкой константе.

SELECT CAST(name as VARBINARY(MAX)), CAST('##TransactionTypes' as VARBINARY(MAX)), name, id FROM sysobjects 
WHERE name like '%Tran%'
29 апр 15, 12:14    [17580604]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
romanstr
Member

Откуда:
Сообщений: 10
a_voronin,

0x230023005400720061006E00730061006300740069006F006E0054007900700065007300
0x23235472616E73616374696F6E5479706573
29 апр 15, 12:23    [17580659]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31969
romanstr
a_voronin,

No item by the name of '[##TransactionTypes]' could be found in the current database 'mybase', given that @itemtype was input as '(null)'.
Странно, на EXEC sp_rename должна быть другая ошибка:
Msg 15600, Level 15, State 1, Procedure sp_rename, Line 516
An invalid parameter or option was specified for procedure 'sys.sp_rename'.

Она генерится из этого кода:
--------------------------------------------------------------------------
--------------------  PHASE 32:  Temporay Table Isssue -------------------
--------------------------------------------------------------------------
-- Disallow renaming object to or from a temp name (starts with #)
if (@objtype = 'object' AND
	(substring(@newname,1,1) = N'#' OR
	substring(object_name(@objid),1,1) = N'#'))
begin
	COMMIT TRANSACTION
	raiserror(15600,-1,-1, 'sys.sp_rename')
	return 1
end
29 апр 15, 12:41    [17580804]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
a_voronin
Member

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

Вот ту делают грязный хак -- обновляют sysobjects -- может и вам так поступить

http://www.sypron.nl/temptab.html
29 апр 15, 12:49    [17580859]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
А может, пусть лежит себе как лежит?
Зачем трогатьь то, что работает?
А то получится вот так: https://www.sql.ru/forum/1154375-1/ubil-vse-bazy
29 апр 15, 12:52    [17580880]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
o-o
Guest
какая интересная муть, вы видели, что имя-то -- сплошная чересполосица с символом char(0)?
и как это оно без этих char(0) норм. отображается-то?
а создать такое не получается, хотя print-ом выводится:
declare @sql varchar(100) = 'create table ' +
   cast(0x230023005400720061006E00730061006300740069006F006E0054007900700065007300 as varchar(100)) +
   '(id int)' ;
print  @sql;
select @sql;

exec (@sql);


К сообщению приложен файл. Размер - 46Kb
29 апр 15, 13:02    [17580963]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
o-o
Guest
картинка без ошибки получилась, извиняюсь, там на саму команду создания вот:
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '#'.
29 апр 15, 13:05    [17580979]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с неверным именем, начинающимся на ##  [new]
Glory
Member

Откуда:
Сообщений: 104751
o-o
какая интересная муть, вы видели, что имя-то -- сплошная чересполосица с символом char(0)?

Нет, вы увидели игнорирование типов при конвертации
select cast('##TransactionTypes' as varbinary(100)), cast(N'##TransactionTypes' as varbinary(100))
29 апр 15, 13:05    [17580981]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить