Existuje něco jako směrnice, kterou mohu ve skriptu použít k vynucení SSMS k povolení / zakázání režimu SQLCMD?
Odpověď
Jak již bylo řečeno, neexistuje žádný způsob.
Jedna věc však je zahrnout rychlou kontrolu do naší hlavičky skriptu, abychom zjistili, zda je režim SQLCMD zapnutý (a skript ukončete, pokud ne):
: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
Existuje z důvodu použití závažnosti 20 má tendenci připojení okamžitě zabít a zabránit spuštění dalšího kódu skriptu, i když jsou ve skriptu GO
dávkové terminátory.
Označují problémy systému a jsou závažné chyby, což znamená, že úloha Database Engine, která provádí příkaz nebo dávku, již není spuštěna. Úloha zaznamenává informace o tom, co se stalo, a poté se ukončí. Ve většině případů připojení aplikace k instance databázového stroje může také ukončit . Pokud k tomu dojde, záleží na problémech em, aplikace se možná nebude moci znovu připojit.
Chybové zprávy v tomto rozsahu mohou ovlivnit všechny procesy přistupující k datům ve stejné databázi a mohou naznačovat, že je poškozena databáze nebo objekt. Chybové zprávy s úrovní závažnosti od 19 do 24 se zapisují do protokolu chyb.
Komentáře
Odpověď
Ne
Ale vždy můžete běžet v režimu SQLCMD a mít v něm přesto T-SQL
Aby bylo možné jasně rozlišovat mezi příkazy SQLCMD a Transact-SQL, musí mít všechny příkazy SQLCMD předponu dvojtečkou (:).
Komentáře
- Je to stále platné pro SQL Server 2012/2014/2016?
- @ hot2use: Ano, I používal jsem ho 2014/2016
SET NOEXEC ON
jako další bezpečnostní opatření, které zabrání spuštění čehokoli jiného ve skriptu.incorrect syntax near ':'
z důvodu:setvar
na začátku …RAISERROR
úroveň závažnosti 20 (a vyšší) je SQL považována za závažnou chybu, která má za následek okamžité přerušení spojení, tedy žádné další dávky (aniSET NOEXEC ON
) se provede. Důvodem, proč existujíNOEXEC
prohlášení, je pokrytí situace, kdy vykonávající uživatel nemásysadmin
/ oprávnění, která jsou nutná pro zvyšování závažných chyb.