Tentukan Koneksi di Manajemen Studio T-SQL Query

9

Saat menambahkan pengguna adalah peran ke server DB, saya sering menggunakan fungsi "Script this action" dari GUI. Saya kemudian pergi ke "Connection :: Change Connection" untuk melakukan hal yang sama pada server saya yang lain.

Apakah ada cara saya dapat menentukan koneksi dalam tindakan scripted sehingga saya tidak perlu melakukan langkah Ubah Koneksi kedua?

Kyle Brandt
sumber

Jawaban:

12

Tidak ada cara untuk melakukan ini sebagai bagian dari skrip dari SSMS, tetapi Anda memiliki dua opsi.

Satu hal yang dapat Anda lakukan adalah menggunakan mode SQLCMD dan perintah :: connect untuk memiliki skrip yang akan terhubung ke beberapa server dan menjalankan skrip. Ini berfungsi baik jika Anda menyimpan skrip untuk pengguna dan menggunakan perintah: r untuk memuat skrip dari file.

Hal lain yang dapat Anda lakukan adalah mengonfigurasi Server Manajemen Pusat dan kemudian menjalankan skrip Anda terhadap beberapa server sekaligus.

SQLRockstar
sumber
1
"Server Manajemen Pusat". ah, itu yang tidak saya gunakan saat ini ...
gbn
ya, itu adalah permata tersembunyi untuk hal-hal seperti ini, jauh lebih baik daripada skrip SQLCMD.
SQLRockstar
2

Sebenarnya, ini dimungkinkan dari dalam T-SQL, tetapi Anda harus memenuhi serangkaian kondisi tertentu dan melompati beberapa rintangan.

  • Pertama, Anda harus mengaktifkan kueri jarak jauh (OPENDATASOURCE / OPENROWSET) di server dari mana kueri akan dijalankan.
  • Kedua, Anda perlu memastikan bahwa server target mengaktifkan akses jarak jauh.
  • Ketiga, Anda harus menggunakan banyak SQL dinamis sehingga Anda dapat "menyuntikkan" kode T-SQL ke dalam mesin basis data server target yang akan dieksekusi.

Berikut ini adalah contoh skrip yang akan memungkinkan Anda memanfaatkan CMS untuk mengotomatiskan tugas-tugas 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.
Dave
sumber
1

Tidak Hanya basis data oleh USE Database. Koneksi tidak bisa skrip.

SSMS 2008 (?) Dan alat-alat lain menawarkan kemampuan untuk "berjalan di beberapa server". Maaf, saya tidak menggunakan fitur ini dalam peran saya saat ini sehingga tidak memiliki masalah ini.

gbn
sumber