Nogle gange kan du finde dig selv i den situation, hvor du har brug for at få navnet på den aktuelle arbejdsstation, der er forbundet til SQL Server.
For eksempel har du måske en lagret procedure, der indsætter data, og du vil registrere navnet på den arbejdsstation, der indsatte dataene.
I sådanne tilfælde kan du bruge HOST_NAME()
funktion.
Dette skal ikke forveksles med at få servernavnet.
Eksempel
Her er et eksempel på at køre en ad-hoc-forespørgsel for at vælge den aktuelle computers navn.
SELECT HOST_NAME();
Resultat:
Tims-MacBook-Pro
I dette tilfælde kørte Tim forespørgslen fra sin MacBook Pro, og navnet på hans computer er Tims-MacBook-Pro.
Du kan sikkert forestille dig, hvor praktisk dette kunne være, hvis du ville være i stand til at se på en række og se, hvem der indsatte den række og fra hvilken arbejdsstation.
Ikke til sikkerhedsformål
Hvor praktisk denne funktion end er, advarer Microsoft mod at bruge den til sikkerhedsformål. Begrundelsen bag dette er, at HOST_NAME()
er leveret af klienten, hvilket muligvis kan give unøjagtige data.
For eksempel kunne en hacker få adgang ved at forfalske værtsnavnet, og det ville naturligvis give en falsk registrering af den arbejdsstation, der blev brugt på tidspunktet for angrebet.
Optagelse af værtsnavnet i en database
Her er et simpelt eksempel på oprettelse af en tabel, der registrerer værtsnavnet som en standardværdi i en kolonne.
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;
Resultat:
+----------+------------------------+---------------------+ | BookID | BookName | Workstation | |----------+------------------------+---------------------| | 1 | How to Spoof Hostnames | Tims-MacBook-Pro | +----------+------------------------+---------------------+
I dette tilfælde brugte jeg DEFAULT
for at angive, at værtsnavnet er standardværdien for rækken. Dette sparer applikationen fra at skulle indsætte denne værdi (men det forhindrer heller ikke applikationen i at tilsidesætte den).
INSERT INTO Books (BookName, Workstation)
VALUES ('How to Override Hostnames', 'Bobs-Windows-Machine!');
SELECT * FROM Books;
Resultat:
+----------+---------------------------+-----------------------+ | BookID | BookName | Workstation | |----------+---------------------------+-----------------------| | 1 | How to Spoof Hostnames | Tims-MacBook-Pro | | 2 | How to Override Hostnames | Bobs-Windows-Machine! | +----------+---------------------------+-----------------------+
Inkluder brugeren
Hvis du vil optage arbejdsstationen, vil du sandsynligvis også inkludere den loggede bruger. Du kan bruge SUSER_NAME()
for det.
SELECT
HOST_NAME() AS HOST_NAME,
SUSER_NAME() AS SUSER_NAME;
Resultat:
+---------------------+--------------+ | HOST_NAME | SUSER_NAME | |---------------------+--------------| | Tims-MacBook-Pro. | sa | +---------------------+--------------+