Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Retornar o nome da estação de trabalho atual que está conectado ao SQL Server (T-SQL)


Ocasionalmente, você pode se encontrar na situação em que precisa obter o nome da estação de trabalho atual conectada ao SQL Server.

Por exemplo, talvez você tenha um procedimento armazenado que insira dados e queira registrar o nome da estação de trabalho que inseriu os dados.

Nesses casos, você pode usar o HOST_NAME() função.

Isso não deve ser confundido com obter o nome do servidor.

Exemplo


Aqui está um exemplo de execução de uma consulta ad-hoc para selecionar o nome do computador atual.
SELECT HOST_NAME();

Resultado:
Tims-MacBook-Pro

Nesse caso, Tim executou a consulta em seu MacBook Pro e o nome de seu computador é Tims-MacBook-Pro.

Você provavelmente pode imaginar o quão útil isso poderia ser se você quisesse poder olhar para uma linha e ver quem inseriu essa linha e de qual estação de trabalho.

Não para fins de segurança


Por mais útil que seja essa função, a Microsoft adverte contra o uso para fins de segurança. O raciocínio por trás disso é que, HOST_NAME() é fornecido pelo cliente, o que poderia fornecer dados imprecisos.

Por exemplo, um hacker poderia obter acesso falsificando o nome do host e isso obviamente forneceria um registro falso da estação de trabalho que estava sendo usada no momento do ataque.

Gravando o nome do host em um banco de dados


Aqui está um exemplo simples de criação de uma tabela que registra o nome do host como um valor padrão em uma coluna.
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;

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

Neste caso eu usei DEFAULT para especificar que o nome do host é o valor padrão para a linha. Isso evita que o aplicativo precise inserir esse valor (mas também não impede que o aplicativo o substitua).
INSERT INTO Books (BookName, Workstation)
VALUES ('How to Override Hostnames', 'Bobs-Windows-Machine!');
SELECT * FROM Books;

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

Incluir o usuário


Se você for gravar a estação de trabalho, provavelmente também desejará incluir o usuário conectado. Você pode usar SUSER_NAME() por isso.
SELECT 
 HOST_NAME() AS HOST_NAME,
 SUSER_NAME() AS SUSER_NAME;

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