Notazione dot SQL

Qualcuno può spiegarmi come SQL Server utilizza la notazione a punti per identificare
la posizione di un tavolo? Ho sempre pensato che la posizione fosse Database.dbo.Table
Ma vedo il codice che ha qualcos’altro al posto di dbo , qualcosa del tipo:
DBName.something.Table Qualcuno può spiegare questo?

Questo è uno schema di database. Il nome completo in tre parti di una tabella è:

 databasename.schemaname.tablename 

Per uno schema predefinito dell’utente, puoi anche omettere il nome dello schema:

 databasename..tablename 

Puoi anche specificare un nome server collegato:

 servername.databasename.schemaname.tablename 

Puoi leggere ulteriori informazioni sull’utilizzo degli identificatori come nomi di tabelle su MSDN :

Il server, il database e i nomi dei proprietari sono noti come qualificatori del nome dell’object. Quando si fa riferimento a un object, non è necessario specificare il server, il database e il proprietario. I qualificatori possono essere omessi contrassegnando le loro posizioni con un punto. Le forms valide di nomi di oggetti includono quanto segue:

server_name.database_name.schema_name.object_name

server_name.database_name..object_name

server_name..schema_name.object_name

server_name … object_name

database_name.schema_name.object_name

database_name..object_name

schema_name.object_name

object_name

Un nome object che specifica tutte e quattro le parti è noto come nome completo. Ogni object creato in Microsoft SQL Server deve avere un nome univoco e completo. Ad esempio, ci possono essere due tabelle denominate xyz nello stesso database se hanno proprietari diversi.

La maggior parte dei riferimenti a oggetti usa nomi in tre parti. Il nome_server predefinito è il server locale. Il nome_database predefinito è il database corrente della connessione. Il nome_schema predefinito è lo schema predefinito dell’utente che invia l’istruzione. Salvo diversa configurazione, lo schema predefinito dei nuovi utenti è lo schema dbo.

Cosa ha detto @Szymon. Si dovrebbe anche fare riferimento a sempre riferimenti all’object qualificanti dello schema (se tabella, vista, stored procedure, ecc.) I riferimenti agli oggetti non qualificati vengono risolti nel modo seguente:

  • Analizzare lo spazio dei nomi del database corrente per un object del nome specificato che appartiene allo schema predefinito delle credenziali in cui è in esecuzione la connessione corrente.

  • Se non trovato, controlla lo spazio dei nomi del database corrente per un object del nome specificato che appartiene allo schema dbo .

E se il riferimento a un object è una stored procedure il cui nome inizia con sp_ , è peggio, poiché due ulteriori passaggi vengono aggiunti al processo di risoluzione (a meno che i riferimenti non siano qualificati per il database): i due passaggi precedenti vengono ripetuti, ma questa volta cercando nel database master invece del database corrente.

Quindi una domanda come

 select * from foo 

richiede due sonde dello spazio dei nomi per risolvere foo (assumendo che la tabella / vista sia effettivamente dbo.foo ): prima sotto lo schema predefinito ( john_doe.foo ) e quindi, non essendo stato trovato, sotto dbo ( dbo.foo ‘), mentre

 select * from dbo.foo 

viene immediatamente risolto con un singolo probe dello spazio dei nomi.

Questo ha 3 implicazioni:

  1. Le ricerche ridondanti sono costose.

  2. Inibisce il caching del piano di query, poiché ogni esecuzione deve essere rivalutata, il che significa che la query deve essere ricompilata per ogni esecuzione (e che elimina i blocchi in fase di compilazione).

  3. In un momento o un altro, ti sparerai al piede e creerai inavvertitamente qualcosa sotto lo schema predefinito che dovrebbe esistere (e forse già lo fa) sotto lo schema dbo . Ora hai due versioni fluttuanti.

    Ad un certo punto, tu o qualcun altro (di solito accade in produzione) eseguirai una query o eseguirai una stored procedure e otterrai … risultati inaspettati. Ci vorrà un bel po ‘di tempo per capire che ci sono due [diverse] versioni dello stesso object, e quale viene eseguito dipende dalle credenziali dell’utente e se il riferimento è stato qualificato o meno dallo schema.

Sempre qualifica schema, a meno che tu non abbia una vera ragione per non farlo.

Detto questo, a volte può essere utile, a fini di sviluppo, essere in grado di mantenere la “nuova” versione di qualcosa sotto il proprio schema personale e la versione “corrente” sotto lo schema “dbo”. Semplifica il collaudo side-by-side. Tuttavia, non è privo di rischi (che vedi sopra).

Quando SQL vede la syntax, prima vedrà lo schema degli utenti corrente per vedere se la tabella esiste, e se ne servirà. In caso contrario, esamina lo schema dbo e utilizza la tabella da lì