Occasionalmente potresti trovarti nella situazione in cui devi ottenere il nome della workstation corrente che è connessa a SQL Server.
Ad esempio, potresti avere una procedura memorizzata che inserisce i dati e desideri registrare il nome della workstation che ha inserito i dati.
In questi casi, puoi utilizzare HOST_NAME()
funzione.
Questo non deve essere confuso con ottenere il nome del server.
Esempio
Ecco un esempio di esecuzione di una query ad hoc per selezionare il nome del computer corrente.
SELECT HOST_NAME();
Risultato:
Tims-MacBook-Pro
In questo caso, Tim ha eseguito la query dal suo MacBook Pro e il nome del suo computer è Tims-MacBook-Pro.
Probabilmente puoi immaginare quanto potrebbe essere utile se volessi essere in grado di guardare una riga e vedere chi ha inserito quella riga e da quale workstation.
Non per motivi di sicurezza
Per quanto utile sia questa funzione, Microsoft avverte di non utilizzarla per motivi di sicurezza. Il ragionamento alla base di questo è che, HOST_NAME()
è fornito dal cliente, che potrebbe eventualmente fornire dati inesatti.
Ad esempio, un hacker potrebbe ottenere l'accesso falsificando il nome host e ciò fornirebbe ovviamente una registrazione falsa della workstation utilizzata al momento dell'attacco.
Registrazione del nome host in un database
Ecco un semplice esempio di creazione di una tabella che registra il nome host come valore predefinito in una colonna.
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;
Risultato:
+----------+------------------------+---------------------+ | BookID | BookName | Workstation | |----------+------------------------+---------------------| | 1 | How to Spoof Hostnames | Tims-MacBook-Pro | +----------+------------------------+---------------------+
In questo caso ho usato DEFAULT
per specificare che il nome host è il valore predefinito per la riga. Ciò evita all'applicazione di dover inserire questo valore (ma non impedisce anche all'applicazione di sovrascriverlo).
INSERT INTO Books (BookName, Workstation)
VALUES ('How to Override Hostnames', 'Bobs-Windows-Machine!');
SELECT * FROM Books;
Risultato:
+----------+---------------------------+-----------------------+ | BookID | BookName | Workstation | |----------+---------------------------+-----------------------| | 1 | How to Spoof Hostnames | Tims-MacBook-Pro | | 2 | How to Override Hostnames | Bobs-Windows-Machine! | +----------+---------------------------+-----------------------+
Includi l'utente
Se hai intenzione di registrare la workstation, probabilmente vorrai includere anche l'utente che ha effettuato l'accesso. Puoi utilizzare SUSER_NAME()
per quello.
SELECT
HOST_NAME() AS HOST_NAME,
SUSER_NAME() AS SUSER_NAME;
Risultato:
+---------------------+--------------+ | HOST_NAME | SUSER_NAME | |---------------------+--------------| | Tims-MacBook-Pro. | sa | +---------------------+--------------+