W jaki sposób mój kolega opracował własny schemat?

14

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 dbozdefiniowano wyraźnie schematu przed nazwą. W rezultacie powstała tabela zwana domain\cowork_id.table_name_heretabelą. 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, dbogdy nie jest to określone?

Steenbergh
źródło
2
sqlblog.org/2009/10/11/…
Aaron Bertrand

Odpowiedzi:

26

Z reguły powinieneś jawnie określać dboschemat, jeśli chcesz utworzyć obiekt w tym schemacie.

W tej chwili db_ownertwoim domyślnym schematem jest dbo, 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 groupktó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)

Schemat niejawny i tworzenie użytkowników

W niektórych przypadkach użytkownik może korzystać z bazy danych bez konta użytkownika bazy danych (podmiot bazy danych w bazie danych). Może się to zdarzyć w następujących sytuacjach:

Logowanie ma uprawnienia CONTROL SERVER.

Użytkownik systemu Windows nie ma indywidualnego konta użytkownika bazy danych (podmiot bazy danych w bazie danych), ale uzyskuje dostęp do bazy danych jako członek grupy systemu Windows, która ma konto użytkownika bazy danych (podmiot bazy danych grupy Windows).

Gdy użytkownik bez konta użytkownika bazy danych utworzy obiekt bez określenia istniejącego schematu, baza danych i schemat domyślny zostaną automatycznie utworzone w bazie danych dla tego użytkownika. Utworzona nazwa użytkownika i schemat bazy danych będzie miała taką samą nazwę jak nazwa, której używał użytkownik podczas łączenia się z programem SQL Server (nazwa logowania do uwierzytelniania programu SQL Server lub nazwa użytkownika systemu Windows).

To zachowanie jest konieczne, aby umożliwić użytkownikom opartym na grupach systemu Windows tworzenie i posiadanie obiektów. Może to jednak spowodować niezamierzone utworzenie schematów i użytkowników. Aby uniknąć niejawnego tworzenia użytkowników i schematów, w miarę możliwości należy jawnie tworzyć podmioty baz danych i przypisywać domyślny schemat. Lub jawnie określ istniejący schemat podczas tworzenia obiektów w bazie danych, używając dwu- lub trzyczęściowych nazw obiektów.

Aby rozwiązać ten problem, po prostu przypisz dboschemat default schemado wszystkich grup użytkowników-Windows lub napisz schemat wprost podczas tworzenia obiektów. Zawsze.

sepupiczny
źródło