Mohu povolit režim SQLCMD zevnitř skriptu?

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.

Závažnosti 20–24 :

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

  • Pro ssms by stačily první 2 řádky a pro sql 2000 Query Analyzer to funguje, ale zpráva se nezobrazí.
  • Ale ne ' t skript bude pokračovat v provádění od dalšího GO?
  • Jak již bylo uvedeno zde , můžete také nastavit SET NOEXEC ON jako další bezpečnostní opatření, které zabrání spuštění čehokoli jiného ve skriptu.
  • @Dan Nolan: Chápu, nějak jsem minul bod 3. řádku. Takže pokud tomu správně rozumím, neexistuje ' řešení, které by zakrylo režim SQLCMD. V podstatě se zobrazí incorrect syntax near ':' z důvodu :setvar na začátku …
  • @youcantryreachingme 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 (ani SET 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.

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *