Kullanıcı veritabanında # ile başlayan SQL Server tablo adı, tempdb içinde değil, geçici tablo değil


13

Her nasılsa, onlarca yıl önce, veritabanımızda bir ile başlayan bir tablo oluşturuldu #. Nesne Gezgini'nde uygulamanın veritabanı altında görünür, içinde görünmez tempdb. Nedense, Azure veritabanını böyle içe aktarmaz.

Bırakamaz, yeniden adlandıramaz veya onunla etkileşime giremeyiz. Ben denedim Sil Nesne Explorer, gelen Senaryo Drop , Rename GUI ve bunların hiçbiri çalıştık.

SQL 2008 R2 kullanıyoruz.

drop table [*app*].[dbo]."#OBSOLETE";

Database name '*app*' ignored, referencing object in tempdb.
Msg 3701, Level 11, State 5, Line 1
Cannot drop the table '#OBSOLETE', because it does not exist or you do not 
have permission.

exec sp_rename "dbo.#OBSOLETE", "dbo.obsolete"

Msg 15225, Level 11, State 1, Procedure sp_rename, Line 338
No item by the name of 'dbo.#OBSOLETE' could be found in the current database '*app*', given that @itemtype was input as '(null)'.

Azure'a taşıyabilmemiz için bu nesneyi nasıl öldürebiliriz?


4
Parantezleri tablo adının etrafına koymayı deneyin, aynı yanıt mı?
rvsc48

1
@ Rvsc48'in çözümü bunu yapmazsa QUOTENAME işlevini kullanmayı deneyebilirsiniz (her ne kadar olacağını düşünüyorum). docs.microsoft.com/tr-tr/sql/t-sql/functions/…
MguerraTorres

1
Parantez: aynı yanıt.
o adam

1
Bu tabloyu içeren DB aşağıdaki sorguyu çalıştırın ve sorgulanmasına çıktı yapıştırın: SELECT [name], CONVERT(VARBINARY(128), [name]) FROM sys.tables WHERE [name] = N'#OBSOLETE';. Teşekkürler.
Solomon Rutzky

2
Başka bir seçenek (test etmek için zamanım yok): 1)object_id Bu tabloyu alın . 2) Örneği tek kullanıcı modunda yeniden başlatın. 3) Dedicated Admin Connection ile bağlanın. 4) Bu DB'de benzer bir şey deneyin UPDATE sys.objects$ SET [name] =N'obsolete' WHERE [object_id] = {ye_olde_object_id}; {enter} GO {enter}.
Denemeye

Yanıtlar:


16

Verilen:

  1. sp_rename nesne kimlikleri yerine nesne adları kullanır,
  2. nesne adını a ile başladığımız için kullanamayız #ve bu özel bir anlama sahip olarak yorumlanır ve farklı şekilde ele alınır,
  3. diğer tüm seçenekler tükendi

Temel alınan sistem kataloğu tablosunu doğrudan Dedicated Admin Console (DAC) bağlantısı üzerinden düzenlemeyi denemelisiniz :

  1. object_idŞu masayı alın .
  2. Örneği Tek Kullanıcı modunda yeniden başlatın. Bu, sistem tablolarını doğrudan güncelleyebilmelidir (yani DAC bağlantısını kullanma zorunluluğu değildir).
  3. Özel Yönetici Konsolu bağlantısı üzerinden bağlanın. Bunu bir Komut İstemi penceresinde çalıştırarak SQLCMD interaktif oturumunda yapabilirsiniz:

    C:\> SQLCMD -A -E

    veya aşağıdakileri kullanarak doğrudan DB'ye bağlanın:

    C:\> SQLCMD -A -E -d {database_name}
  4. Bu DB'de aşağıdakine benzer bir şey deneyin:

    UPDATE sys.objects$ {enter}
    SET [name] = N'obsolete' {enter}
    WHERE [object_id] = {ye_olde_object_id}; {enter}
    GO {enter}

    Siz girene kadar ifadeyi yürütmez GO {enter}.

Lütfen sistem katalog tablolarını doğrudan düzenlerken dikkatli olun ve bunu yapma fikrinden çok rahat olmayın. Bu, yalnızca bir sorunu düzeltmenin başka bir yolu yoksa (burada durum gibi) yapılması gereken bir şeydir . Doğrudan düzenlemeler yapmaktan kaçınmanın muhtemelen birkaç nedeni vardır, ancak başlangıçta akla gelen ikisi şunlardır:

  • Oluşturduğumuz veri modelleri gibi, bilmediğimiz şeylerin nasıl çalıştığına dair muhtemelen kurallar ve iş akışları vardır (örneğin, normalleştirme, çeşitli tablolardaki verilerin durumunu yöneten "iş" kuralları vb.)
  • Büyük olasılıkla doğrudan düzenlemeler yapmak, sorunla karşılaşırsanız ve bir destek sözleşmeniz varsa, Microsoft'un sorumluluğunu geçersiz kılar (Destek sözleşmesinin / sözleşmelerinin şartlarını görmedim, ancak bu dilin olmayacağına inanmakta zorlanıyorum Orada)

    @ Paul Randal ilgili bir cevabımla ilgili yorumda şunları doğruladı : "bir sistem tablosunu manuel olarak düzenlemek, veritabanının önyükleme sayfasında veritabanınızı bu şekilde düzenlenmiş olarak işaretleyen bir bayrağı ayarlıyor ve CSS yardım etmemeye karar verebilir daha sonra bu veritabanıyla ilgili sorun yaşarsanız "


4
Cevabı seviyorum, ama bunun neden bu kadar tehlikeli olduğuna dair bir cümle eklemeye değer olabilir mi?
Joe Obbish

@JoeObbish Teşekkürler ve iyi bir öneri. Yarın bir şeyler eklemeye çalışacağım.
Solomon Rutzky

2
@JoeObbish Bir şey ekledim. Bu yeterli mi?
Solomon Rutzky
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.