In che modo il mio collega ha ottenuto il suo schema?


14

Ho una procedura memorizzata che:

  • controlla se esiste una tabella e, in tal caso, la rilascia.
  • crea di nuovo quella tabella
  • quindi riempie quella tabella con circa 30 query.

Quando io (DB Owner) eseguo questo proc, tutto funziona come previsto. Quando il mio collega lo fa, che ha i diritti DROP / CREATE su questo database attraverso un ruolo in Active Directory, diverse cose vanno male. Ciò che mi sorprende è questo:

La creazione della tabella non aveva lo dboschema esplicitamente specificato prima del nome. Ciò ha comportato la creazione di una tabella denominata domain\cowork_id.table_name_heretabella. Oltre a quella tabella creata nel suo schema personale, ora ha anche quello schema nel database (non esisteva prima dell'esecuzione del proc).

Quello che è successo? Perché SQL Server crea tabelle nello schema dell'utente anziché in dboquando non è specificato?


Risposte:


26

Di norma, è necessario specificare esplicitamente lodbo schema se si desidera creare l'oggetto in questo schema.

Come sei db_owner, lo schema predefinito è dbo, quindi non ci sono problemi quando non si specifica lo schema dbo durante la creazione di oggetti. Ma per altri utenti (Windows) non è lo stesso.

I tuoi utenti sono membri Windows groupche non hanno uno schema predefinito. In questo caso l'utente e lo schema corrispondenti vengono creati quando l'utente crea un oggetto, è documentato qui: CREATE SCHEMA (Transact-SQL)

Schema implicito e creazione dell'utente

In alcuni casi un utente può utilizzare un database senza disporre di un account utente del database (un'entità database nel database). Questo può accadere nelle seguenti situazioni:

Un accesso ha i privilegi di CONTROL SERVER.

Un utente di Windows non ha un singolo account utente del database (un'entità database nel database), ma accede a un database come membro di un gruppo Windows che ha un account utente del database (un'entità database per il gruppo Windows).

Quando un utente senza un account utente del database crea un oggetto senza specificare uno schema esistente, un'entità principale del database e uno schema predefinito verranno creati automaticamente nel database per quell'utente. L'entità database e lo schema creati avranno lo stesso nome utilizzato dall'utente durante la connessione a SQL Server (il nome di accesso all'autenticazione di SQL Server o il nome utente di Windows).

Questo comportamento è necessario per consentire agli utenti basati su gruppi di Windows di creare e possedere oggetti. Tuttavia, può provocare la creazione involontaria di schemi e utenti. Per evitare la creazione implicita di utenti e schemi, quando possibile creare esplicitamente entità di database e assegnare uno schema predefinito. Oppure dichiarare esplicitamente uno schema esistente quando si creano oggetti in un database, usando nomi di oggetti a due o tre parti.

Per risolvere il problema basta assegnare lo dboschema default schemaa tutti i tuoi gruppi utenti-Windows o scrivere esplicitamente lo schema durante la creazione di oggetti. Sempre.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.