sql >> データベース >  >> RDS >> Sqlserver

SQL Server(T-SQL)に接続されている現在のワークステーション名を返す

    場合によっては、SQLServerに接続されている現在のワークステーションの名前を取得する必要がある状況に陥ることがあります。

    たとえば、データを挿入するストアドプロシージャがあり、データを挿入したワークステーションの名前を記録したい場合があります。

    このような場合は、HOST_NAME()を使用できます。 機能。

    これは、サーバー名の取得と混同しないでください。

    アドホッククエリを実行して現在のコンピュータの名前を選択する例を次に示します。

    SELECT HOST_NAME();

    結果:

    Tims-MacBook-Pro

    この場合、TimはMacBook Proからクエリを実行し、コンピュータの名前はTims-MacBook-Proです。

    行を見て、誰がその行をどのワークステーションから挿入したかを確認したい場合は、これがどれほど便利か想像できるでしょう。

    セキュリティ目的ではありません

    この機能は便利ですが、Microsoftはセキュリティ目的で使用しないように警告しています。この背後にある理由は、HOST_NAME() クライアントによって提供されているため、不正確なデータが提供される可能性があります。

    たとえば、ハッカーはホスト名をスプーフィングすることでアクセスを取得する可能性があり、攻撃時に使用されていたワークステーションの誤った記録を明らかに提供します。

    データベースへのホスト名の記録

    これは、ホスト名をデフォルト値として列に記録するテーブルを作成する簡単な例です。

    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;

    結果:

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

    この場合、DEFAULTを使用しました ホスト名が行のデフォルト値であることを指定します。これにより、アプリケーションがこの値を挿入する必要がなくなります(ただし、アプリケーションによる値のオーバーライドも妨げられません)。

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

    結果:

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

    ユーザーを含める

    ワークステーションを記録する場合は、ログインしているユーザーも含めることをお勧めします。 SUSER_NAME()を使用できます そのために。

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

    結果:

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

    1. SQLで列にランダムな数値を入力するにはどうすればよいですか?すべての行で同じ値を取得します

    2. MySQL-行から列へ

    3. 別のユーザーアカウント(macOS)からのmySQLインスタンスの回復

    4. 合計を計算するための最良のアプローチ– SQLServer2012用に更新