Czasami możesz znaleźć się w sytuacji, w której musisz uzyskać nazwę bieżącej stacji roboczej, która jest połączona z SQL Server.
Na przykład, być może masz procedurę składowaną, która wstawia dane i chcesz zarejestrować nazwę stacji roboczej, która wstawiała dane.
W takich przypadkach możesz użyć HOST_NAME()
funkcja.
Nie należy tego mylić z pobraniem nazwy serwera.
Przykład
Oto przykład uruchomienia zapytania ad hoc w celu wybrania nazwy bieżącego komputera.
SELECT HOST_NAME();
Wynik:
Tims-MacBook-Pro
W tym przypadku Tim uruchomił zapytanie ze swojego MacBooka Pro, a nazwa jego komputera to Tims-MacBook-Pro.
Prawdopodobnie możesz sobie wyobrazić, jakie to może być przydatne, gdybyś chciał móc spojrzeć na wiersz i zobaczyć, kto go wstawił iz której stacji roboczej.
Nie do celów bezpieczeństwa
Chociaż ta funkcja jest przydatna, firma Microsoft ostrzega przed używaniem jej do celów bezpieczeństwa. Powodem tego jest to, że HOST_NAME()
jest dostarczany przez klienta, co może ewentualnie dostarczyć niedokładne dane.
Na przykład haker mógłby uzyskać dostęp, podszywając się pod nazwę hosta, co oczywiście dostarczyłoby fałszywego zapisu stacji roboczej używanej w czasie ataku.
Zapisywanie nazwy hosta w bazie danych
Oto prosty przykład tworzenia tabeli, która rejestruje nazwę hosta jako domyślną wartość w kolumnie.
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;
Wynik:
+----------+------------------------+---------------------+ | BookID | BookName | Workstation | |----------+------------------------+---------------------| | 1 | How to Spoof Hostnames | Tims-MacBook-Pro | +----------+------------------------+---------------------+
W tym przypadku użyłem DEFAULT
aby określić, że nazwa hosta jest wartością domyślną dla wiersza. Oszczędza to aplikacji przed koniecznością wstawiania tej wartości (ale również nie zapobiega jej nadpisaniu przez aplikację).
INSERT INTO Books (BookName, Workstation)
VALUES ('How to Override Hostnames', 'Bobs-Windows-Machine!');
SELECT * FROM Books;
Wynik:
+----------+---------------------------+-----------------------+ | BookID | BookName | Workstation | |----------+---------------------------+-----------------------| | 1 | How to Spoof Hostnames | Tims-MacBook-Pro | | 2 | How to Override Hostnames | Bobs-Windows-Machine! | +----------+---------------------------+-----------------------+
Dołącz użytkownika
Jeśli zamierzasz nagrywać stację roboczą, prawdopodobnie chcesz również dołączyć zalogowanego użytkownika. Możesz użyć SUSER_NAME()
za to.
SELECT
HOST_NAME() AS HOST_NAME,
SUSER_NAME() AS SUSER_NAME;
Wynik:
+---------------------+--------------+ | HOST_NAME | SUSER_NAME | |---------------------+--------------| | Tims-MacBook-Pro. | sa | +---------------------+--------------+