Občas se můžete dostat do situace, kdy potřebujete získat název aktuální pracovní stanice, která je připojena k SQL Serveru.
Možná máte například uloženou proceduru, která vkládá data, a chcete zaznamenat název pracovní stanice, která data vložila.
V takových případech můžete použít HOST_NAME()
funkce.
Toto nelze zaměňovat se získáním názvu serveru.
Příklad
Zde je příklad spuštění ad-hoc dotazu pro výběr názvu aktuálního počítače.
SELECT HOST_NAME();
Výsledek:
Tims-MacBook-Pro
V tomto případě Tim spustil dotaz ze svého MacBooku Pro a název jeho počítače je Tims-MacBook-Pro.
Pravděpodobně si dokážete představit, jak užitečné by to mohlo být, kdybyste se chtěli podívat na řádek a zjistit, kdo tento řádek vložil a z jaké pracovní stanice.
Není pro bezpečnostní účely
Přestože je tato funkce užitečná, společnost Microsoft varuje před jejím použitím z bezpečnostních důvodů. Důvodem je, že HOST_NAME()
poskytuje klient, což by případně mohlo poskytnout nepřesné údaje.
Hacker by například mohl získat přístup podvržením názvu hostitele, což by zjevně poskytlo falešný záznam o pracovní stanici používané v době útoku.
Záznam názvu hostitele do databáze
Zde je jednoduchý příklad vytvoření tabulky, která zaznamená název hostitele jako výchozí hodnotu ve sloupci.
CREATE TABLE Books
(
BookID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
BookName nvarchar(255) NOT NULL,
Workstation nvarchar(50) NOT NULL DEFAULT HOST_NAME()
);
INSERT INTO Books (BookName)
VALUES ('How to Spoof Hostnames');
SELECT * FROM Books;
Výsledek:
+----------+------------------------+---------------------+ | BookID | BookName | Workstation | |----------+------------------------+---------------------| | 1 | How to Spoof Hostnames | Tims-MacBook-Pro | +----------+------------------------+---------------------+
V tomto případě jsem použil DEFAULT
k určení, že název hostitele je výchozí hodnotou pro řádek. Tím se zabrání tomu, aby aplikace musela vkládat tuto hodnotu (ale také to aplikaci nezabrání v jejím přepsání).
INSERT INTO Books (BookName, Workstation)
VALUES ('How to Override Hostnames', 'Bobs-Windows-Machine!');
SELECT * FROM Books;
Výsledek:
+----------+---------------------------+-----------------------+ | BookID | BookName | Workstation | |----------+---------------------------+-----------------------| | 1 | How to Spoof Hostnames | Tims-MacBook-Pro | | 2 | How to Override Hostnames | Bobs-Windows-Machine! | +----------+---------------------------+-----------------------+
Zahrnout uživatele
Pokud budete nahrávat pracovní stanici, pravděpodobně budete chtít zahrnout i přihlášeného uživatele. Můžete použít SUSER_NAME()
za to.
SELECT
HOST_NAME() AS HOST_NAME,
SUSER_NAME() AS SUSER_NAME;
Výsledek:
+---------------------+--------------+ | HOST_NAME | SUSER_NAME | |---------------------+--------------| | Tims-MacBook-Pro. | sa | +---------------------+--------------+