GNU/Linux >> Znalost Linux >  >> Linux

Jak přímo upravujete systémové katalogy v SQL Server 2017?

!! PŘEČTĚTE SI VAROVÁNÍ TUČNĚ DOLE !!

Možnost konfigurace serveru allow updates byl počínaje SQL Serverem 2005 vykreslen jako nefunkční. V dokumentaci je uvedeno, že nedochází k chybě, ale ve skutečnosti neumožňuje žádné přímé aktualizace tabulek systémového katalogu.

Jediný způsob, jak toho nyní dosáhnout, BÝT SI PLNĚ VĚDOM, ŽE JE TO NEBEZPEČNÉ A NE DOPORUČENO , je použít připojení Dedicated Admin Console (DAC).

Nejprve budete potřebovat skutečné Název tabulky, kterou chcete aktualizovat. Jméno, které SELECT from je pouze zobrazení systémového katalogu, nikoli skutečná tabulka. Obvykle používám následující:

EXEC sp_helptext N'sys.{some name here}';

Potom proveďte následující:

  1. Restartujte instanci v režimu jednoho uživatele pomocí

    sudo systemctl stop mssql-server
    sudo -u mssql /opt/mssql/bin/sqlservr -m
    

    Jen pro upřesnění:tento krok má umožnit aktualizace systémového katalogu. Připojení k samotnému DAC pro provádění dalších operací nevyžaduje režim jednoho uživatele.

  2. Připojte se prostřednictvím připojení k vyhrazené administrátorské konzoli s sa nebo nějaký jiný sysadmin Přihlásit se. To lze provést v interaktivní relaci SQLCMD spuštěním následujícího v okně příkazového řádku:

    sqlcmd -S admin:localhost -U sa
    

    Pokud to linuxové SQLCMD z nějakého důvodu nepodporuje, můžete povolit vzdálená připojení DAC a později použít počítač se systémem Windows a zjistit, zda DAC funguje. DAC v systému Linux můžete povolit pomocí:

    EXEC sp_configure 'remote admin connections', 1;  
    RECONFIGURE;  
    
  3. V této DB zkuste něco jako následující:

    UPDATE sys.{whatever_name_you_found} {enter}
    SET [some_column] = {some_value} {enter}
    WHERE [some_other_column] = {the_better_be_correct_or_else_ID}; {enter}
    GO {enter}
    

    Příkaz neprovede, dokud nevložíte GO {enter} .

NEBEZPEČÍ BUDE ROBINSONOVI!!

Při přímých úpravách tabulek systémového katalogu buďte opatrní a příliš se nesnažte to udělat. To je něco, co by se mělo udělat pouze pokud neexistuje žádný jiný způsob, jak problém vyřešit (jako je tento případ). Pravděpodobně existuje několik důvodů, proč se vyhýbat přímým úpravám, ale dva, které vás zpočátku napadnou, jsou:

  • Podobně jako u datových modelů, které vytváříme, existují pravděpodobná pravidla a pracovní postupy pro to, jak věci fungují, o kterých nevíme (např. denormalizace, „obchodní“ pravidla upravující stav dat v různých tabulkách atd.)
  • Je velmi pravděpodobné, že provedení přímých úprav ruší odpovědnost společnosti Microsoft pomoci vám, pokud narazíte na problémy a budete mít smlouvu o podpoře (neviděl jsem podmínky smlouvy o podpoře, ale těžko uvěřím, že by takový jazyk nebyl v tam).

    @Paul Randal v komentáři potvrdil:„manuální úprava systémové tabulky neodvolatelně nastaví příznak na spouštěcí stránce databáze, který označí vaši databázi jako upravenou tímto způsobem, a CSS se může rozhodnout, že vám nepomůže, pokud budete mít následně problémy s touto databází."


Krátká odpověď:Nemáte.

Delší odpověď:Pamatujte, že byste to nikdy neměli dělat na produkčním systému . Můžete a pravděpodobně věci pěkně pokazíte a MS vám řekne, abyste mlátili do písku, pokud jim zavoláte a požádáte o pomoc se všemi vašimi nepodporovanými/nedokumentovanými tahanicemi.

S tím pryč z cesty, jdeme na to.

Nejprve budete muset SQL Server uvést do režimu pro jednoho uživatele. Označili jste otázku "linux" a nevím, jestli to funguje úplně stejně, ale pro verzi Windows prostě zastavte službu SQL Server a spusťte ji z příkazového řádku s "-m" argument, např.:

cd "\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn"
sqlservr.exe -m

Jakmile je to spuštěno, musíte se připojit k připojení vyhrazeného správce (DAC) pro instanci. Můžete použít jakýkoli nástroj, který se vám líbí, např. Management Studio nebo sqlcmd, ale mějte na paměti, že v Management Studio nemůžete připojit Průzkumníka objektů, protože běží v režimu pro jednoho uživatele. V obou případech zadejte ADMIN: prefix pro název serveru. Myslím, že můžete udělat ADMIN:(local) pro připojení k místní výchozí instanci.

Poté můžete do značné míry změnit, co chcete, ale budete muset zjistit, jaké jsou skutečné základní tabulky pro určitá zobrazení systémového katalogu. Například sys.database_principals . Chcete-li zobrazit definici pohledu, přepněte do databáze "mssqlsystemresource" (běžně není viditelná) a použijte sp_helptext zobrazíte kód všech systémových zobrazení/postupů/funkcí.

USE mssqlsystemresource
GO
EXEC sp_helptext 'sys.server_principals'

Všimněte si, že jedna z tabulek, na kterou tento pohled odkazuje, je master.sys.sysxlgns , což je pravděpodobně dobré místo pro začátek. Najdete sloupec s názvem pwdhash v této tabulce, která podle všeho obsahuje hashovaná hesla.

Až budete hotovi, přejděte do příkazového okna, na kterém je spuštěn SQL Server v režimu pro jednoho uživatele, a stisknutím kláves Ctrl-C jej vypněte.

Pamatujte, že toto nikdy nedělejte na produkčním systému, pokud vám podpora společnosti Microsoft neposkytne konkrétní pokyny jinak . Kromě toho se bavte a ujistěte se, že máte zálohy pro případ zničení instance!


Linux
  1. Jak zkontrolovat verzi OS a Linuxu

  2. Jak změnit identitu systému Linux

  3. Jak rychle nastavit server KVM

  1. Jak upravit výchozí obrázek na pozadí systému?

  2. Jak přesměrovat výstup system() do souboru?

  3. jak spustit server tomcat v linuxu?

  1. Jak spustit příkaz jako správce systému (root)?

  2. Jak najít všechna úložiště Subversion v systému?

  3. Jak získáte aktuální čas na serveru?