Tablonun şemasını belirtmeden sorgulama


10

SQL Server 2000'den 2008 veritabanına bir sürü tablo aktardım. İçe aktarılan tüm tablolara kullanıcı adım eklenir: örn erpadmin.tablename.

Tablo özelliklerinde db şeması olarak 'erpadmin'i listeler. Bir sorgu yazdığımda artık 'erpadmin' yazmam gerekiyor. kafa karıştırıcı tüm tablo isimlerinin önünde.

Mevcut sonuç:

select *
from erpadmin.tablename

İstenen sonuç:

select *
from  tablename

Yanıtlar:


23

SQL Server 2000'de olduğu gibi dbo şemasını kullanmaya geri dönmek isterseniz, tabloyu dbo şemasına geri taşıyabilirsiniz:

ALTER SCHEMA dbo TRANSFER erpadmin.tablename;

Diğer bir seçenek, dbo olmayan şemaya sahip olmaktan hoşlanıyorsanız, bir kullanıcının şemasını erpadminbelirtmemeniz durumunda, varsayılan şemayı kullanmanız gerekir. (Sysadmin sabit sunucu rolünün üyeleri varsayılan olarak yok sayılır DEFAULT_SCHEMAve kullanılır dbo.)

ALTER USER erpadmin WITH DEFAULT_SCHEMA = erpadmin;

Sahip olduğunuz iki bölüm adı (schema.table), içine girmek için iyi bir alışkanlıktır, bu nedenle hangi tabloya başvurduğunuzu açıkça görebilirsiniz. Bazı özellikler iki bölümlü bir ad kullanmanızı gerektirir, Dizine Alınmış Görünümler buna bir örnektir.


17

Bu, veritabanı nesnelerine erişirken şema adını neden belirtmeniz gerektiğinin klasik bir örneğidir . Belirtilmediğinde ve varsayılan olmayan bir şemadaki bir nesneye erişmeye çalıştığınızda, şu anda gördüğünüz sorunla karşılaşacaksınız.

Gerçek düzeltme, uygulamanızı (veya şu anda soruna neden olan herhangi bir sorgulama aracısını) açık olarak değiştirmektir.

Bir sorgu yazdığımda artık 'erpadmin' yazmam gerekiyor. kafa karıştırıcı tüm tablo isimlerinin önünde.

Bu kafa karıştırıcı değil, açık bir adlandırma kuralı . Nesne karıştırmayı ve tutarsızlıkları önlemek için bu terminolojiye bağlı kalmanızı tavsiye ederim.


3
Her zaman iki bölümlü adlar kullanmanın bir başka nedeni, birden çok kullanıcının aynı kodu yürüttüğü (örneğin select ... from table5 ;) durumdan kaçınması ve farklı sonuçlar almasıdır. Bu, plan önbelleğe alma için kötü ve sorun giderme için de kötüdür (ipucu destek personeli, "bu sorgu burada iyi çalışır"). Ayrıca, işlevlerin ve görünümlerin indekslenmesi için gerekli olan şema bağlama, iki parça adı gerektirir. TLDR: tembel olmayı bırakın - iki parça adı kullanın.
Greenstone Walker

7

@AdamWenger cevabına ek olarak. Şemaya aktarmak üzere komut dosyaları oluşturmak için aşağıdaki komut dosyasını kullanabilirsiniz

select 'ALTER SCHEMA dbo TRANSFER '+s.name+'.'+t.name
from sys.schemas s
     join sys.tables t on t.schema_id=s.schema_id
where s.name='erpadmin'

4

Sorununuz muhtemelen göçün nasıl yapıldığından kaynaklanıyor. Sahip olarak kabul edilmediğiniz sürece, şeyler kullanıcılarınıza eklenmemelidir.

Şemalar, mantıklı ne olursa olsun tabloları ayırmanıza yardımcı olmak için vardır. İK departmanı için bir kaynak tablonuz olduğunu ve her ikisini de aynı veritabanında tutarken üretim departmanı için ayrı bir kaynak tablonuz olduğunu varsayalım. Bu durumda, biri üretim şemasında, diğeri İK şemasında olmak üzere, kaynaklar adında iki tablonuz olabilir. Bu nedenle, öğeleri varsayılan şemaya getirmediğiniz sürece shcemas belirtilmelidir.

Başka bir nedenden dolayı göçü yeniden yapmıyorsanız, Adam Wenger'ın transferi akıllıca bir seçenek olmalıdır.


-2

Komutunuzu USE [tablename] başvurmak için ilişkili bir veritabanı yok ve baktığınız veritabanı oturum açmış kullanıcı için varsayılan değil ile başlatın Sorgu penceresinin üst kısmında büyük olasılıkla "ana" yazıyor


3
Yani [database_name], değil mi?
dezso
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.