Management Studio T-SQLクエリで接続を指定する


9

ユーザーをロールとしてDBサーバーに追加する場合、GUIから「このアクションのスクリプトを作成する」機能をよく使用します。次に、「接続::接続の変更」に移動して、他のサーバーでも同じことを行います。

スクリプトアクションで接続を指定できる方法はあるので、2番目の接続の変更手順を実行する必要はありませんか?

回答:


12

SSMSのスクリプトの一部としてこれを行う方法はありませんが、2つのオプションがあります。

複数のサーバーに接続してスクリプトを実行するスクリプトを作成するには、SQLCMDモードと:: connectコマンドを使用することができます。これは、ユーザーのスクリプトを保存し、:rコマンドを使用してファイルからスクリプトをロードする場合にうまく機能します。

もう1つの方法は、中央管理サーバーを構成してから、一度に複数のサーバーに対してスクリプトを実行することです。


1
「中央管理サーバー」。ああ、それは私が現在使っていないことです...
gbn '22

ええ、それはこのようなもののための隠された宝石であり、SQLCMDスクリプトよりはるかに優れています。
SQLRockstar 2011年

2

実際には、T-SQL内から実行することもできますが、特定の条件セットを満たし、いくつかのフープを通過する必要があります。

  • まず、クエリを実行するサーバーでリモートクエリ(OPENDATASOURCE / OPENROWSET)を有効にする必要があります。
  • 次に、ターゲットサーバーでリモートアクセスが有効になっていることを確認する必要があります。
  • 第3に、T-SQLコードをターゲットサーバーのデータベースエンジンに「注入」して実行できるように、動的SQLを多用する必要があります。

以下は、CMSを利用してSQLタスクを自動化できるサンプルスクリプトです。

/**********************************************************************/

/* Global change password script                                      */

/*                                                                    */

/* This script changes the password for a SQL login on all servers    */

/* managed by a Central Management Server. It assumes that the login  */

/* exists on all servers, and that all servers are SQL 2005 or later. */

/**********************************************************************/

DECLARE @nServer NVARCHAR (128) -- Variable to hold the instance name retrieved from the CMS

DECLARE @nSQL NVARCHAR (4000)   -- Variable to hold dynamic SQL

DECLARE @ServerFetch INT        -- Variable to hold the fetch status. In SQL 2005, the @@FETCH_STATUS

                                -- variable is scoped at the system level, so if another process is also

                                -- using a cursor the @@FETCH_STATUS variable will be set according to

                                -- that operation. This allows us to store a persistent value.


DECLARE curServer CURSOR LOCAL STATIC FOR  -- Declare the cursor with the LOCAL and STATIC options, and

                                           -- retrieve the list of server names from the Central Management

                                           -- Server. The value in the [sysmanagement_shared_server_groups_internal]

                                           -- table is user-defined; for purposes of this example we have

                                           -- created a group named "SQL2008".

    SELECT DISTINCT

    s.server_name AS 'ServerName'

    FROM OPENDATASOURCE ('SQLOLEDB', 'Data Source = CMS1\Management; Integrated Security = SSPI').msdb.dbo.sysmanagement_shared_server_groups_internal g

    INNER JOIN OPENDATASOURCE ('SQLOLEDB', 'Data Source = CMS1\Management; Integrated Security = SSPI').msdb.dbo.sysmanagement_shared_registered_servers_internal s ON g.server_group_id = s.server_group_id

    WHERE g.name = 'SQL2008'

    ORDER BY s.server_name

OPEN curServer

FETCH FIRST FROM curServer INTO @nServer       -- Retrieve the first row

SET @ServerFetch = @@FETCH_STATUS              -- Store the status of the fetch operation

WHILE @ServerFetch = 0                         -- If the fetch was successful, we enter the loop. Otherwise

                                               -- execution passes to the statement following the END statement.

    BEGIN

    -- Build the dynamic SQL to alter the password for the SQL login.

    SET @nSQL = 'EXEC OPENDATASOURCE (''SQLOLEDB'', ''Data Source = ' + @nServer

        + '; Integrated Security = SSPI'').master.dbo.sp_executesql N''ALTER LOGIN SQLLogin WITH PASSWORD = ''''<enterStrongPasswordHere>'''''

    -- Execute the dynamic SQL.

    EXEC sp_executesql @nSQL

    FETCH NEXT FROM curServer INTO @nServer    -- Retrieve the next row.

    SET @ServerFetch = @@FETCH_STATUS          -- Store the status of the fetch operation.

    END

CLOSE curServer        -- Close the cursor.

DEALLOCATE curServer   -- Remove the cursor from memory.

1

いいえUSE Database。データベースのみ。接続はスクリプト化できません。

SSMS 2008(?)およびその他のツールは、「複数のサーバーで実行」する機能を提供します。申し訳ありませんが、現在の役割ではこの機能を使用していないため、この問題は発生しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.