Af en toe bevindt u zich misschien in de situatie waarin u de naam moet krijgen van het huidige werkstation dat is verbonden met SQL Server.
Misschien hebt u bijvoorbeeld een opgeslagen procedure die gegevens invoegt en wilt u de naam opnemen van het werkstation dat de gegevens heeft ingevoegd.
In dergelijke gevallen kunt u de HOST_NAME()
. gebruiken functie.
Dit moet niet worden verward met het verkrijgen van de servernaam.
Voorbeeld
Hier is een voorbeeld van het uitvoeren van een ad-hocquery om de naam van de huidige computer te selecteren.
SELECT HOST_NAME();
Resultaat:
Tims-MacBook-Pro
In dit geval voerde Tim de zoekopdracht uit vanaf zijn MacBook Pro en de naam van zijn computer is Tims-MacBook-Pro.
Je kunt je vast wel voorstellen hoe handig dit kan zijn als je naar een rij wilt kunnen kijken en zien wie die rij heeft ingevoegd en vanaf welk werkstation.
Niet voor beveiligingsdoeleinden
Hoe handig deze functie ook is, Microsoft waarschuwt ervoor deze niet te gebruiken voor beveiligingsdoeleinden. De redenering hierachter is dat, HOST_NAME()
wordt aangeleverd door de klant, wat mogelijk onnauwkeurige gegevens kan opleveren.
Een hacker zou bijvoorbeeld toegang kunnen krijgen door de hostnaam te vervalsen en dat zou uiteraard een vals record opleveren van het werkstation dat op het moment van de aanval werd gebruikt.
De hostnaam opnemen in een database
Hier is een eenvoudig voorbeeld van het maken van een tabel waarin de hostnaam als standaardwaarde in een kolom wordt vastgelegd.
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;
Resultaat:
+----------+------------------------+---------------------+ | BookID | BookName | Workstation | |----------+------------------------+---------------------| | 1 | How to Spoof Hostnames | Tims-MacBook-Pro | +----------+------------------------+---------------------+
In dit geval gebruikte ik DEFAULT
om op te geven dat de hostnaam de standaardwaarde voor de rij is. Hierdoor hoeft de applicatie deze waarde niet in te voeren (maar het verhindert ook niet dat de applicatie deze waarde overschrijft).
INSERT INTO Books (BookName, Workstation)
VALUES ('How to Override Hostnames', 'Bobs-Windows-Machine!');
SELECT * FROM Books;
Resultaat:
+----------+---------------------------+-----------------------+ | BookID | BookName | Workstation | |----------+---------------------------+-----------------------| | 1 | How to Spoof Hostnames | Tims-MacBook-Pro | | 2 | How to Override Hostnames | Bobs-Windows-Machine! | +----------+---------------------------+-----------------------+
De gebruiker opnemen
Als u het werkstation gaat opnemen, wilt u waarschijnlijk ook de ingelogde gebruiker opnemen. Je kunt SUSER_NAME()
. gebruiken daarvoor.
SELECT
HOST_NAME() AS HOST_NAME,
SUSER_NAME() AS SUSER_NAME;
Resultaat:
+---------------------+--------------+ | HOST_NAME | SUSER_NAME | |---------------------+--------------| | Tims-MacBook-Pro. | sa | +---------------------+--------------+