Mam procedurę składowaną, która:
- sprawdza, czy tabela istnieje, a jeśli tak, upuszcza ją.
- ponownie tworzy ten stół
- następnie wypełnia tabelę około 30 zapytaniami.
Kiedy ja (właściciel DB) uruchamiam ten proc, wszystko działa zgodnie z przeznaczeniem. Kiedy robi to mój współpracownik, który ma uprawnienia DROP / CREATE do tej bazy danych dzięki roli w Active Directory, kilka rzeczy idzie nie tak. To, co mnie denerwuje, to:
Podczas tworzenia tabeli nie dbo
zdefiniowano wyraźnie schematu przed nazwą. W rezultacie powstała tabela zwana domain\cowork_id.table_name_here
tabelą. Oprócz tej tabeli, która jest tworzona w jego osobistym schemacie, ma on także ten schemat w bazie danych (nie istniał przed uruchomieniem proc).
Co się stało? Dlaczego SQL Server tworzy tabele w schemacie użytkownika zamiast w, dbo
gdy nie jest to określone?
sql-server
sql-server-2016
Steenbergh
źródło
źródło
Odpowiedzi:
Z reguły powinieneś jawnie określać
dbo
schemat, jeśli chcesz utworzyć obiekt w tym schemacie.W tej chwili
db_owner
twoim domyślnym schematem jestdbo
, więc nie ma problemu, jeśli nie określisz schematu dbo podczas tworzenia obiektów. Ale dla innych użytkowników (Windows) to nie to samo.Twoi użytkownicy są członkami tego,
Windows group
który nie ma domyślnego schematu. W takim przypadku odpowiedni użytkownik i schemat są tworzone, gdy użytkownik tworzy dowolny obiekt, jest to udokumentowane tutaj: CREATE SCHEMA (Transact-SQL)Aby rozwiązać ten problem, po prostu przypisz
dbo
schematdefault schema
do wszystkich grup użytkowników-Windows lub napisz schemat wprost podczas tworzenia obiektów. Zawsze.źródło