Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Zurückgeben des aktuellen Arbeitsstationsnamens, der mit SQL Server verbunden ist (T-SQL)

Gelegentlich befinden Sie sich möglicherweise in der Situation, dass Sie den Namen der aktuellen Arbeitsstation abrufen müssen, die mit SQL Server verbunden ist.

Vielleicht haben Sie beispielsweise eine gespeicherte Prozedur, die Daten einfügt, und Sie möchten den Namen der Workstation aufzeichnen, die die Daten eingefügt hat.

In solchen Fällen können Sie den HOST_NAME() verwenden Funktion.

Dies darf nicht mit dem Abrufen des Servernamens verwechselt werden.

Beispiel

Hier ist ein Beispiel für das Ausführen einer Ad-hoc-Abfrage, um den Namen des aktuellen Computers auszuwählen.

SELECT HOST_NAME();

Ergebnis:

Tims-MacBook-Pro

In diesem Fall hat Tim die Abfrage von seinem MacBook Pro ausgeführt, und der Name seines Computers lautet Tims-MacBook-Pro.

Sie können sich wahrscheinlich vorstellen, wie praktisch dies sein könnte, wenn Sie in der Lage sein möchten, eine Zeile anzuzeigen und zu sehen, wer diese Zeile von welcher Workstation aus eingefügt hat.

Nicht für Sicherheitszwecke

So praktisch diese Funktion auch ist, Microsoft warnt davor, sie aus Sicherheitsgründen einzusetzen. Der Grund dafür ist, dass HOST_NAME() wird vom Kunden bereitgestellt, der möglicherweise ungenaue Daten liefern könnte.

Beispielsweise könnte sich ein Hacker Zugriff verschaffen, indem er den Hostnamen fälscht, was offensichtlich eine falsche Aufzeichnung der zum Zeitpunkt des Angriffs verwendeten Arbeitsstation liefern würde.

Speichern des Hostnamens in einer Datenbank

Hier ist ein einfaches Beispiel für die Erstellung einer Tabelle, die den Hostnamen als Standardwert in einer Spalte aufzeichnet.

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;

Ergebnis:

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

In diesem Fall habe ich DEFAULT verwendet um anzugeben, dass der Hostname der Standardwert für die Zeile ist. Dies erspart der Anwendung das Einfügen dieses Werts (aber es verhindert auch nicht, dass die Anwendung ihn überschreibt).

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

Ergebnis:

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

Benutzer einbeziehen

Wenn Sie die Arbeitsstation aufzeichnen, möchten Sie wahrscheinlich auch den angemeldeten Benutzer einbeziehen. Sie können SUSER_NAME() verwenden dafür.

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

Ergebnis:

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