Понякога може да се окажете в ситуация, в която трябва да получите името на текущата работна станция, която е свързана към SQL Server.
Например, може би имате съхранена процедура, която вмъква данни, и искате да запишете името на работната станция, която е вмъкнала данните.
В такива случаи можете да използвате HOST_NAME()
функция.
Това не трябва да се бърка с получаването на името на сървъра.
Пример
Ето пример за изпълнение на ad hoc заявка за избор на името на текущия компютър.
SELECT HOST_NAME();
Резултат:
Tims-MacBook-Pro
В този случай Тим изпълни заявката от своя MacBook Pro, а името на компютъра му е Tims-MacBook-Pro.
Вероятно можете да си представите колко удобно би било това, ако искате да можете да разгледате ред и да видите кой е вмъкнал този ред и от коя работна станция.
Не за целите на сигурността
Колкото и удобна да е тази функция, Microsoft предупреждава да не я използвате за целите на сигурността. Причината за това е, че HOST_NAME()
се предоставя от клиента, което е възможно да предостави неточни данни.
Например хакер може да получи достъп, като подправи името на хоста и това очевидно би осигурило фалшив запис на работната станция, използвана по време на атаката.
Записване на името на хоста в база данни
Ето прост пример за създаване на таблица, която записва името на хоста като стойност по подразбиране в колона.
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;
Резултат:
+----------+------------------------+---------------------+ | BookID | BookName | Workstation | |----------+------------------------+---------------------| | 1 | How to Spoof Hostnames | Tims-MacBook-Pro | +----------+------------------------+---------------------+
В този случай използвах DEFAULT
за да укажете, че името на хоста е стойността по подразбиране за реда. Това спестява на приложението необходимост да вмъква тази стойност (но също така не пречи на приложението да я отмени).
INSERT INTO Books (BookName, Workstation)
VALUES ('How to Override Hostnames', 'Bobs-Windows-Machine!');
SELECT * FROM Books;
Резултат:
+----------+---------------------------+-----------------------+ | BookID | BookName | Workstation | |----------+---------------------------+-----------------------| | 1 | How to Spoof Hostnames | Tims-MacBook-Pro | | 2 | How to Override Hostnames | Bobs-Windows-Machine! | +----------+---------------------------+-----------------------+
Включете потребителя
Ако ще запишете работната станция, вероятно ще искате да включите и влезлия потребител. Можете да използвате SUSER_NAME()
за това.
SELECT
HOST_NAME() AS HOST_NAME,
SUSER_NAME() AS SUSER_NAME;
Резултат:
+---------------------+--------------+ | HOST_NAME | SUSER_NAME | |---------------------+--------------| | Tims-MacBook-Pro. | sa | +---------------------+--------------+