Než se objevila synonyma SQL Server, všichni si přáli zjednodušit a zlepšit práci s databázemi.
Představte si, že máte aplikaci s databází, která odkazuje na jinou databázi ze stejného serveru. Poté velká reorganizace přinutí váš tým přenést druhou databázi na jiný server.
Není pochyb o tom, že se vaše aplikace rozbije. Ale co v takovém případě uděláte? Propojit 2 servery a napevno zakódovat všechny odkazy (znovu), aby ukazovaly na nový server?
Můžete to udělat, pokud chcete, a zapomenout, pokud na to máte jen pár nebo tucet odkazů. Ale pokud dojde k dalšímu převodu nebo přejmenování, budete muset opakovat stejnou noční můru.
Nicméně existuje lepší způsob, jak se s tím vypořádat.
Představujeme synonyma SQL Server
Než se ponoříme do toho, co můžete dělat se synonymy SQL Server, popišme, co to jsou.
Synonymum v jakémkoli mluveném a psaném jazyce odkazuje na slovo nebo frázi, která má stejný význam jako jiné slovo nebo fráze. Takže slovo nádherné je synonymem pro krásné a atraktivní .
Podobně jako to, co víme o synonymech slov a frází, označují Synonyma SQL Server alternativní název databázového objektu umístěného na místním nebo vzdáleném serveru. Přečtěte si více zde.
Jak uvidíte v následujících faktech, SQL Server Synonyms může velmi usnadnit údržbu vaší aplikace.
Takže, pojďme začít!
1. Synonyma SQL Server vám mohou zjednodušit práci při přenosu nebo přejmenování základních objektů
Za prvé, ušetří vám potíže se změnami kódu, když je databáze z jakéhokoli důvodu přesunuta na jiný server nebo přejmenována. Podívejme se na scénář, který jsme zmínili v otevření tohoto příspěvku.
Velká reorganizace přinutí váš tým změnit odkaz na všechny objekty v moje databáze2 do prodserver2.mydatabase2.
Zadáte dotaz na sys.sql_modules se všemi výskyty mydatabase2 z moje databáze1 .
USE mydatabase1
GO
SELECT
b.name
,a.definition
,b.type_desc
FROM sys.sql_modules a
INNER JOIN sys.all_objects b on a.object_id = b.object_id
WHERE a.definition like '%mydatabase2%'
GO
Nyní bude výstup skriptu výše obsahovat seznam všech objektů, které mají odkazy na mydatabase2 . Pěkné, co? A to pomůže definovat rozsah práce, která musí být provedena.
Ale to je jen začátek. Musíte také zkontrolovat, zda je kód ve vaší klientské aplikaci nebo jakýkoli jiný kód, který na to odkazuje mimo vaši databázi.
Množství kódu, které je ovlivněno, ukazuje, jak velký je váš nový problém.
Nyní je zde několik dalších drobností o tom, co se děje v tomto skriptu:
- sys.sql_modules zahrnují objekty SQL, které jsou moduly definovanými SQL, jako jsou pohledy, uložené procedury, funkce atd.
- jméno sloupec je místo, kde je název objektu.
- Kód SQL pro objekt je v definici sloupec sys.sql_modules .
- sys.all_objects zahrňte všechny objekty ve vaší databázi, jako jsou tabulky, pohledy atd.
- Vzali jsme type_desc sloupec k určení, o jaký typ objektu se jedná (pohled, uložená procedura atd.)
- kde klauzule filtruje dotaz na jakýkoli kód SQL, který obsahuje odkaz na mydatabase2 .
- Abyste dosáhli uspokojivého výsledku pomocí výše uvedeného skriptu, musíte mít oprávnění pro všechny objekty. Obraťte se na to u svého správce databáze nebo někoho s podobnou rolí. Můžete se také podívat na toto.
Nyní, když víte, jak získat rozsah své práce, je čas to napravit.
Jak napravit tuto změť kódu, aby se to už neopakovalo
Dobře. Musím se přiznat.
Použití SQL Server Synonyms pouze sníží vaše problémy na minimum, ale neodstraní je.
Teď, když je to z cesty, je tu dobrá zpráva:Pokud máte 10 odkazů na vzdálený objekt, než použijete synonyma, upravíte všech 10. Jakmile však začnete používat synonymum pro tento vzdálený objekt, místo úpravy 10 výskytů, změníte pouze 1. Nic víc.
Zde jsou kroky k vyřešení tohoto problému pomocí synonym:
- Vytvořte synonymum pro každý ze vzdálených objektů. Tedy místo prodserver2.mydatabase2.schema1.object1 můžete na něj odkazovat pomocí synonyma.
- Upravte odkazy na každý objekt na jeho synonyma.
Později se dozvíte podrobnosti o tom, jak to udělat.
The Takeaway:
Synonyma poskytují vrstvu abstrakce, která chrání odkazy na základní objekty z jakékoli části vašeho kódu, ať už uvnitř vaší databáze, klientské aplikace nebo kdekoli jinde. Můžete se tedy radovat, když dojde k další změně, ať už jde o přenos objektu nebo přejmenování.
2. Pro většinu objektů můžete vytvořit synonyma SQL Server
Dále pojďme zjistit, jaké objekty mohou mít synonyma?
- Tabulky
- Zobrazení
- Uložené procedury
- Funkce
Nyní, když znáte typy objektů, možná máte představu o tom, co můžete dělat se synonymy. Pojďme konkrétněji.
3. Můžete vydávat příslušné příkazy pro Synonymum objektu
Za třetí, zde jsou některé specifické příkazy pro každý typ objektu.
Tabulky
Stejně jako můžete provést SELECT, INSERT, UPDATE a DELETE pro tabulku, můžete totéž udělat pro její synonymum.
Takže místo:
SELECT * FROM prodserver2.mydatabase2.schema1.table1
Můžete mít kratší verzi, která bude odolná vůči další změně:
SELECT * FROM synonym1
Protože je to tento případ, můžete také provést toto:
UPDATE synonym1
SET column1 = <value>
A totéž platí pro INSERT a DELETE.
Mějte však na paměti následující:
- Vložením nového záznamu prostřednictvím synonyma přidáte nový záznam do základní tabulky. V našem případě prodserver2.mydatabase2.schema1.table1 .
- Aktualizace a smazání bude mít stejný účinek.
Zatím jsme ukázali pouze příkazy DML. Co takhle příkazy DDL jako DROP?
Bohužel je nemůžete provést. Zde je důvod, proč:
Vypuštěním synonyma nezrušíte základní tabulku. Vypadne synonymum. Za chvíli se o tom budu podrobně věnovat.
Ale je tu ještě jedna věc, kterou můžete udělat pro SQL Server Synonyma tabulek:JOINy.
Jak pohodlné to může být? Místo vydání tohoto:
SELECT
a.column1
,b.column1
FROM table3 a
INNER JOIN prodserver2.mydatabase2.schema1.table1 b on a.id = b.id
Můžete provést toto:
SELECT
a.column1
,b.column1
FROM table3 a
INNER JOIN synonym1 b on a.id = b.id
Je to o něco jednodušší? Jasná věc!
Uložené procedury
Jeden relevantní příkaz, který můžete provést se synonymem uložené procedury, je EXEC.
Takže namísto vyvolání vzdálené procedury, jako je tato:
EXEC prodserver2.mydatabase2.schema1.spProcedure1
Pro výše uvedený postup můžete vytvořit synonymum. Říkejme tomu synProcedure1 . A vyvolejte ji tímto způsobem:
EXEC synProcedure1
Budeme pokračovat? V podstatě totéž můžete udělat s POHLEDY a FUNKCÍ. Samozřejmě, pokud máte potřebná oprávnění. Nejprve si ale proberme, jak vytvořit synonyma SQL Server.
4. S CREATE
můžete začít svůj úkol se synonymy SQL ServerDosáhli jsme bodu, jak můžete vytvářet synonyma. Zde je návod, jak to můžeme udělat pomocí T-SQL pro tabulku:
CREATE SYNONYM synonym1 FOR prodserver2.mydatabase2.schema1.table1
Ale vezměte na vědomí toto upozornění:
Kontrola existence a oprávnění mydatabase2.schema1.table1 na prodserver2 je odloženo do doby běhu.
To znamená, že nebudete vědět, zda:
- dva servery (prodserver1 a prodserver2 ) jsou již propojeny.
- databáze mydatabase2 , schéma schéma1 a tabulka table1 skutečně existují.
- váš přístup k těmto zdrojům je povolen.
Po vytvoření synonyma jej tedy otestujte spuštěním příkazů, u kterých očekáváte, že budou fungovat.
A s uloženými procedurami, pohledy a funkcemi byste měli jednat stejným způsobem.
Ale to není vše. Pokud dokážeme vytvořit synonymum, můžeme ho také smazat pomocí:
DROP SYNONYM synonym1
A tady je další upozornění:Vzhledem k tomu, že synonyma můžete kdykoli vypustit, budou odkazy na vynechaná synonyma kontrolovány pouze za běhu.
Než tedy synonymum vypustíte, zkontrolujte sys.sql_modules pokud na to existují nějaké odkazy.
Použití SQL Server Management Studio (SSMS) k vytváření a rušení synonym
Doposud jsme používali T-SQL k vytváření a odstraňování synonym SQL Server. Když děláte totéž, můžete raději použít grafické rozhraní.
Rozjedeme se.
Vytváření synonym
Pokud vás nebaví psát příkazy, zde jsou kroky, které je třeba při vytváření synonym dodržovat:
- Spusťte SSMS a přihlaste se k serveru SQL.
- Vyhledejte databázi, ve které chcete vytvořit synonymum.
- Rozbalte jej.
- Klikněte pravým tlačítkem na Synonyma složku a vyberte Nové synonymum .
- Vyplňte formulář informacemi požadovanými pro synonyma, včetně názvu, schématu atd.
- Klikněte na tlačítko OK .
Níže je snímek obrazovky formuláře v SSMS:
Vypuštění synonym
Když už mluvíme o preferencích, psaní příkazů pro vytváření synonym je moje věc. Ale upustit je podle libosti je jednodušší než psát příkazy. Samozřejmě, je to jen můj vkus. Každopádně níže jsou kroky, které je třeba dodržet při vypouštění synonyma:
- Spusťte SSMS a přihlaste se k serveru SQL.
- Hledejte databázi, kde se nachází synonymum, které chcete vypustit.
- Rozbalte jej.
- Rozbalte Synonyma složka.
- Hledejte synonymum, které chcete vypustit.
- Klikněte pravým tlačítkem na synonymum, které chcete odstranit, a vyberte možnost Smazat .
- Klikněte na tlačítko OK .
Chcete-li shrnout výše uvedené kroky, jednoduše klikněte pravým tlačítkem na synonymum, které chcete odstranit, a vyberte možnost Smazat a nakonec klikněte na OK .
Níže je snímek obrazovky okna, které se zobrazí před potvrzením smazání:
5. Můžete zabezpečit synonyma SQL Server
Pomocí GRANT, DENY nebo REVOKE můžete ovládat přístup k synonymu.
UDĚLENÍ oprávnění SELECT synonymu synonymum1 uživateli jménem testuser , postupujte následovně:
GRANT SELECT ON synonym1 to testuser
Další oprávnění, která můžete přidat k synonymu nebo z něj odebrat, jsou následující:
- KONTROLA
- PROVÁDĚT
- AKTUALIZOVAT
- VLOŽIT
- SMAZAT
- ZOBRAZIT DEFINICE
- PŘEVZÍT VLASTNICTVÍ
6. Nemůžete najít tuto tabulku, pohled nebo postup? Mohlo by to být synonym
Jedním z problémů, které může nováček ve vašem týmu potkat, je „chybějící“ tabulka, pohled, postup nebo funkce. Samozřejmě, pokud je na objekt vydán příkaz SELECT, může to být tabulka nebo pohled. Ale nemůže to najít v seznamu tabulek nebo zobrazení. A pokud předtím nepoužíval SQL Server Synonyms, je to další problém.
Nedostatek orientace, mezera v dokumentaci nebo mezera ve vašich normách lze dát do pořádku. Zde je šikovný skript, který vám pomůže prezentovat seznam synonym a jeho základní objekt vašemu novému členovi týmu:
SELECT
a.[name]
,a.[base_object_name]
,OBJECTPROPERTYEX(OBJECT_ID(a.[name]), 'BaseType') as BaseType
,b.type_desc
FROM sys.synonyms a
INNER JOIN (SELECT DISTINCT type, type_desc from sys.all_objects) b on
CONVERT(varchar(2),OBJECTPROPERTYEX(OBJECT_ID(a.[name]), 'BaseType')) = b.type
"Chybí" předmět? Už ne, pokud je to synonymum.
Ale než se začnete s tímto skriptem rozčilovat, měli byste vzít v úvahu několik dalších věcí:
- sys.synonyma je místo, kde jsou v aktuální databázi definována všechna synonyma SQL Server.
- Vzali jsme typy a popisy typů (typ a type_desc respektive) v sys.all_objects . Pokud máte lepší nápad než se k nim připojit pomocí dílčího dotazu, dejte mi prosím vědět.
- OBJECTPROPERTYEX se používá k získání typu základního objektu, pokud se jedná o tabulku, uloženou proceduru nebo jinak.
- Nakonec, pokud nemáte minimální oprávnění potřebná ke spuštění tohoto skriptu a získání požadovaného výstupu, je čas se spřátelit se svým DBA nebo někým s podobnou rolí:)
Možná se ale ptáte, proč to všechno dělat, když to nebude fungovat dobře?
7. Budou mít synonyma SQL Server vliv na výkon?
To je společný problém. A abychom přiblížili, co se děje v zákulisí, podívejme se na shrnutí toho, co se stane v prováděcím plánu:
- Při provádění nejjednoduššího kódu se synonymem (např. SELECT * ze synonyma1) SQL Server vstoupí do fáze vazby, kde základní objekt nahradí synonymum.
- Dále, ať už existuje jakýkoli nejlepší plán optimalizace pro provedení příkazu k základnímu objektu, bude stejný.
Zde je několik otázek a odpovědí týkajících se 2 výše uvedených tvrzení:
- Jak dlouho SQL Server provádí fázi vazby? ODPOVĚĎ:Netrvá to dlouho. Obvykle se to stane během mrknutí.
- Pokud další krok používá stejný nejlepší plán optimalizace se základním objektem a dotaz na základní objekt je „dostatečně rychlý“, bude pomalejší? ODPOVĚĎ:Ne, protože bude používat stejný plán provádění.
- A co ověřování z nového serveru? ODPOVĚĎ:Pokud dojde k mírným zpožděním způsobeným přenosem databáze na nový server, nejsou způsobena synonymem. Výkon dotazu při volání pomocí synonyma nebo pevného kódování server.database.schema.object by měl být stejný, protože synonymum je pouze alternativní název pro základní objekt. Vyřešte pomalý výkon ze základního objektu.
Ale neberte mě za slovo. Měli byste si to ověřit sami pomocí plánu provádění dotazu a skutečného výkonu.
Závěr
Celkově jsme probrali spoustu informací o SQL Server Synonyms, takže si to zrekapitulujeme.
Za prvé, synonymum je prostě alternativní název, který vás ušetří před změnami a přenosy názvu objektu. Za druhé, dobrými kandidáty na synonyma jsou tabulky, pohledy, uložené procedury a funkce. Dále můžete ze synonyma provádět příkazy vhodné pro jeho základní objekt. Můžete to také zajistit. Pokud pak potřebujete zobrazit seznam synonym, máte sys.synonyma pomoct ti. A konečně, výkon by neměl být velkým problémem, pokud u základního objektu nejsou žádné problémy s výkonem.
Tak proč to nezkusit dnes?
Co myslíš? Dejte nám vědět v komentářích.