Zapytanie bez konieczności określania schematu tabeli

10

Zaimportowałem kilka tabel z SQL Server 2000 do mojej bazy danych 2008. Wszystkie importowane tabele są poprzedzone moją nazwą użytkownika, np erpadmin.tablename. : .

We właściwościach tabeli znajduje się „erpadmin” jako schemat db. Kiedy piszę zapytanie, muszę teraz wpisać „erpadmin”. przed wszystkimi nazwami tabel, co jest mylące.

Aktualny wynik:

select *
from erpadmin.tablename

Pożądany rezultat:

select *
from  tablename
Ramdas Bhosale
źródło

Odpowiedzi:

23

Jeśli chcesz wrócić do korzystania ze schematu dbo, tak jak w SQL Server 2000, możesz przenieść tabelę z powrotem do schematu dbo:

ALTER SCHEMA dbo TRANSFER erpadmin.tablename;

Alternatywą, jeśli chcesz mieć schemat inny niż dbo, jest ustawienie domyślnego schematu użytkownika, erpadmina jeśli nie określisz schematu, zostanie on użyty jako domyślny. (Członkowie sysadmin naprawili rolę serwera domyślnie ignorują DEFAULT_SCHEMAi używają dbo).

ALTER USER erpadmin WITH DEFAULT_SCHEMA = erpadmin;

Jednak twoja dwuczęściowa nazwa (schema.table) jest dobrym nawykiem, abyś mógł się do niej przyzwyczaić, dzięki czemu możesz wyraźnie określić, do której tabeli się odwołujesz. Niektóre funkcje wymagają użycia dwuczęściowej nazwy, Widoki indeksowane są jednym z przykładów.

Adam Wenger
źródło
17

Jest to klasyczny przypadek, dla którego należy podać nazwę schematu podczas uzyskiwania dostępu do obiektów bazy danych. Jeśli nie jest określony i próbujesz uzyskać dostęp do obiektu w schemacie innym niż domyślny, napotkasz problem, który właśnie widzisz.

Prawdziwą poprawką jest zmiana aplikacji (lub dowolnego agenta zapytań, który masz teraz powodujący problem), aby był jawny.

Kiedy piszę zapytanie, muszę teraz wpisać „erpadmin”. przed wszystkimi nazwami tabel, co jest mylące.

To nie jest mylące, to wyraźna konwencja nazewnictwa . Zalecam trzymanie się tej nomenklatury, aby uniknąć przetasowania i niespójności obiektów.

Thomas Stringer
źródło
3
Innym powodem zawsze używania dwuczęściowych nazw jest uniknięcie sytuacji, w której wielu użytkowników wykonuje ten sam kod (na przykład select ... from table5 ;) i uzyskuje różne wyniki. Jest to złe dla buforowania planu, a także dla rozwiązywania problemów (osoba obsługująca cue, „to zapytanie działa tutaj”). Również tworzenie schematów, które jest wymagane do indeksowania funkcji i widoków, wymaga dwóch nazw części. TLDR: przestań być leniwy - użyj dwóch nazw części.
Greenstone Walker
7

Jako dodatek do odpowiedzi @AdamWenger. Aby utworzyć skrypty do przeniesienia do innego schematu, możesz użyć następującego skryptu

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'
Igor Borisenko
źródło
4

Twój problem jest prawdopodobnie spowodowany sposobem migracji. Rzeczy nie powinny być dołączane do twojego użytkownika, chyba że jesteś uważany za właściciela.

Istnieją schematy, które pomogą ci rozdzielić tabele według jakiegokolwiek sensu. Załóżmy, że masz jedną tabelę zasobów dla działu HR i potrzebujesz osobnej tabeli dla działu produkcji, zachowując obie w tej samej bazie danych. W takim przypadku możesz mieć dwie tabele o nazwie zasoby, jedną w schemacie produkcyjnym i drugą w schemacie HR. Dlatego należy określić shcemas, chyba że wprowadzisz elementy do domyślnego schematu.

Jeśli nie powtarzasz migracji z innego powodu, transfer Adama Wengera powinien być rozsądną opcją.

JoseTeixeira
źródło
-2

Uruchom polecenie za pomocą USE [tablename] zapytania Nie ma powiązanej bazy danych, do której można się odwoływać, a baza danych, którą przeglądasz, nie jest domyślna dla zalogowanego użytkownika W górnej części okna zapytania prawdopodobnie znajduje się „master”

Jan
źródło
3
Masz na myśli [database_name], prawda?
dezso