Perché il prefisso dello schema (dbo) è obbligatorio quando chiamiamo una funzione?


9

Quando l'utente è mappato con lo schema predefinito (dbo) e possiamo selezionare tutte le tabelle in [dbo] senza aggiungere prefisso allo schema.

Siamo in grado di eseguire stored procedure senza prefisso se si trova nello schema predefinito.

Detto questo, perché dobbiamo aggiungere un prefisso a una funzione con lo schema?

Grazie!

Risposte:


11

Allora perché possiamo chiamare la funzione senza prefisso (schema), creato sotto dbo?

Dal documento online di libri su UDF

Le funzioni con valori scalari possono essere invocate laddove vengono utilizzate espressioni scalari. Ciò include le colonne calcolate e le definizioni dei vincoli CHECK. Le funzioni con valori scalari possono anche essere eseguite utilizzando l'istruzione EXECUTE. Le funzioni con valori scalari devono essere invocate utilizzando almeno il nome in due parti della funzione .

Quindi questa è sostanzialmente una restrizione stabilita dal team di sviluppo di SQL Server e la considero abbastanza corretta. Anche se in qualche modo è permesso (solo per motivi di conversazione) userei comunque il prefisso Schema.

Sostengo sempre l'utilizzo del nome dello schema anche se funzionerebbe senza aggiungerlo. Questa è la migliore pratica e tutti gli sviluppatori "buoni" la usano indipendentemente dalla ridondanza.

L'altro motivo che vedo è che il motore di database ha bisogno di qualcosa per distinguere tra funzioni di sistema simili getdate ()e funzioni definite dall'utente. Se è consentito chiamare la funzione senza il nome dello schema, in che modo il motore di database distinguerebbe tra la funzione creata dall'utente denominata Getdate o la funzione GETDATE () del sistema.


Quindi perché è diverso con SP. Come hai detto, potrebbe essere per evitare di nominare le collisioni. Ho appena creato un SP "create procedure sp_help as select getdate ()" nel mio database utenti e quando eseguo con o senza schema (dbo), SQL Server fa riferimento a SP di sistema. Perché non esegue il mio SP che ho creato.
Rajesh Ranjan,

1
@rajeshRajan Dato che hai sp_procname (hai prefissato la tua procedura con SP), questo obbliga SQL Server a cercare prima nel database master il piano compilato e poiché questo proc esiste nel database master verrà eseguito non tuo, se non fosse per trovare il proc in master quindi avrebbe eseguito il tuo. Non dovresti mai creare proc con prefisso sp_ perché ha problemi di prestazioni.
Shanky,

Penso che Shanky abbia risposto direttamente alla domanda "perché" quando ha menzionato che è stata impostata dal team di sviluppo di SQL Server. Potresti chiedere perché lo hanno fatto e perché il comportamento delle funzioni non è coerente con le procedure, ma la risposta probabilmente non ha importanza.
Michael J Swart,

1
A proposito, l'impatto sulle prestazioni delle procedure che iniziano con "sp_" non può essere misurato. Non è stato un problema per anni. Il prefisso sp potrebbe non essere ancora una buona idea, ma le prestazioni non sono la ragione.
Michael J Swart,

10

L'altra risposta spiega che questa è una restrizione ma non il motivo.

Il requisito non è sempre vero. Gli UDF scalari possono essere modificati EXECe utilizzare comunque la risoluzione implicita ( esempio )

Immagino che questo sia per evitare di nominare le collisioni.

Se fosse possibile fare riferimento alle funzioni senza schema, qualcuno che ha creato la propria funzione che è stata chiamata crypt_gen_randomnel 2000 o nel 2005 incontrerebbe problemi nell'aggiornamento a una versione successiva, poiché questo divenne il nome di una funzione integrata nel 2008.

Non vi è alcuna ambiguità con l' execuso poiché le funzioni integrate non possono essere chiamate in questo modo.


Quindi perché è diverso con SP. Come hai detto, potrebbe essere per evitare di nominare le collisioni. Ho appena creato un SP "create procedure sp_help as select getdate ()" nel mio database utenti e quando eseguo con o senza schema (dbo), SQL Server fa riferimento a SP di sistema. Perché non esegue il mio SP che ho creato.
Rajesh Ranjan,

3
@Rajesh. Gli oggetti che iniziano con sp_ hanno un case speciale per cercare sempre nel database master / risorse. Ed è documentato che questo prefisso dovrebbe essere evitato. Non esiste una convenzione del genere per le funzioni integrate.
Martin Smith,
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.