Esiste qualcosa come una direttiva che posso usare in uno script per forzare SSMS ad abilitare / disabilitare la modalità SQLCMD?
Risposta
Come è stato detto, non cè “modo”.
Tuttavia, una cosa è includere un rapido controllo nellintestazione dello script, per determinare se la modalità SQLCMD è attiva (e terminare lo script in caso contrario):
:setvar DatabaseName "MyDatabase" GO IF ("$(DatabaseName)" = "$" + "(DatabaseName)") RAISERROR ("This script must be run in SQLCMD mode. Disconnecting.", 20, 1) WITH LOG GO -- The below is only run if SQLCMD is on, or the user lacks permission to raise fatal errors IF @@ERROR != 0 SET NOEXEC ON GO PRINT "You will only see this when SQLCMD mode is on" -- Rest of script goes here GO SET NOEXEC OFF GO
Cè un motivo per cui viene utilizzato Severity 20, tende a terminare immediatamente la connessione, impedendo lesecuzione di altro codice di script, anche se ci sono GO
terminatori batch più avanti nello script.
Indica problemi di sistema e sono errori irreversibili, il che significa che lattività del Motore di database che sta eseguendo unistruzione o un batch non è più in esecuzione. Lattività registra le informazioni su ciò che si è verificato e quindi termina. Nella maggior parte dei casi, la connessione dellapplicazione a listanza del Motore di database potrebbe anche terminare . Se ciò accade, a seconda del problema em, lapplicazione potrebbe non essere in grado di riconnettersi.
I messaggi di errore in questo intervallo possono influenzare tutti i processi che accedono ai dati nello stesso database e possono indicare che un database o un oggetto è danneggiato. I messaggi di errore con un livello di gravità compreso tra 19 e 24 vengono scritti nel registro degli errori.
Commenti
Risposta
No.
Ma puoi sempre eseguire in modalità SQLCMD e avere T-SQL in esso
Per fare una chiara distinzione tra i comandi SQLCMD e Transact-SQL, tutti i comandi SQLCMD devono essere preceduti da due punti (:).
Commenti
- È ancora valido per SQL Server 2012/2014/2016?
- @ hot2use: Sì, io ' lho usato nel 2014/2016
SET NOEXEC ON
come misura di sicurezza aggiuntiva per impedire lesecuzione di qualsiasi altra cosa nello script.incorrect syntax near ':'
a causa di:setvar
allinizio …RAISERROR
il livello di gravità 20 (e superiore) è considerato da SQL un errore irreversibile, che si traduce nellimmediata interruzione della connessione, quindi nessun ulteriore batch (nemmenoSET NOEXEC ON
) viene eseguito. Il motivo per cui leNOEXEC
sono presenti è per coprire la situazione in cui lutente in esecuzione non hasysadmin
/ necessari per generare errori irreversibili.