Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Renvoyer le nom du poste de travail actuel connecté à SQL Server (T-SQL)

Parfois, vous pouvez vous retrouver dans une situation où vous devez obtenir le nom du poste de travail actuel connecté à SQL Server.

Par exemple, vous avez peut-être une procédure stockée qui insère des données et vous souhaitez enregistrer le nom du poste de travail qui a inséré les données.

Dans de tels cas, vous pouvez utiliser le HOST_NAME() fonction.

Cela ne doit pas être confondu avec l'obtention du nom du serveur.

Exemple

Voici un exemple d'exécution d'une requête ad hoc pour sélectionner le nom de l'ordinateur actuel.

SELECT HOST_NAME();

Résultat :

Tims-MacBook-Pro

Dans ce cas, Tim a exécuté la requête depuis son MacBook Pro et le nom de son ordinateur est Tims-MacBook-Pro.

Vous pouvez probablement imaginer à quel point cela pourrait être pratique si vous vouliez pouvoir regarder une ligne et voir qui a inséré cette ligne et à partir de quel poste de travail.

Pas à des fins de sécurité

Aussi pratique que soit cette fonction, Microsoft met en garde contre son utilisation à des fins de sécurité. Le raisonnement derrière cela est que, HOST_NAME() est fourni par le client, ce qui pourrait éventuellement fournir des données inexactes.

Par exemple, un pirate pourrait accéder en usurpant le nom d'hôte et cela fournirait évidemment un faux enregistrement du poste de travail utilisé au moment de l'attaque.

Enregistrer le nom d'hôte dans une base de données

Voici un exemple simple de création d'une table qui enregistre le nom d'hôte comme valeur par défaut dans une colonne.

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;

Résultat :

+----------+------------------------+---------------------+
 | BookID   | BookName               | Workstation         |
 |----------+------------------------+---------------------|
 | 1        | How to Spoof Hostnames | Tims-MacBook-Pro    |
 +----------+------------------------+---------------------+ 

Dans ce cas, j'ai utilisé DEFAULT pour spécifier que le nom d'hôte est la valeur par défaut de la ligne. Cela évite à l'application d'avoir à insérer cette valeur (mais cela n'empêche pas non plus l'application de la remplacer).

INSERT INTO Books (BookName, Workstation)
VALUES ('How to Override Hostnames', 'Bobs-Windows-Machine!');
SELECT * FROM Books;

Résultat :

+----------+---------------------------+-----------------------+
 | BookID   | BookName                  | Workstation           |
 |----------+---------------------------+-----------------------|
 | 1        | How to Spoof Hostnames    | Tims-MacBook-Pro      |
 | 2        | How to Override Hostnames | Bobs-Windows-Machine! |
 +----------+---------------------------+-----------------------+ 

Inclure l'utilisateur

Si vous souhaitez enregistrer le poste de travail, vous souhaiterez probablement également inclure l'utilisateur connecté. Vous pouvez utiliser SUSER_NAME() pour ça.

SELECT 
 HOST_NAME() AS HOST_NAME,
 SUSER_NAME() AS SUSER_NAME;

Résultat :

+---------------------+--------------+
 | HOST_NAME           | SUSER_NAME   |
 |---------------------+--------------|
 | Tims-MacBook-Pro.   | sa           |
 +---------------------+--------------+