Management Studio T-SQL Sorgusunda Bağlantı Belirtme


9

Kullanıcıları DB sunucularına eklerken, GUI'den "Bu eylemi komut dosyası" işlevini sık sık kullanırım. Daha sonra aynı şeyi diğer sunucularımda yapmak için "Bağlantı :: Bağlantıyı Değiştir" e gidiyorum.

Komut dizisi eyleminde bağlantıyı belirleyebilmemin bir yolu var mı?

Yanıtlar:


12

Bunu SSMS'den bir komut dosyasının parçası olarak yapmanın bir yolu yok, ancak iki seçeneğiniz var.

Yapabileceğiniz bir şey, birden çok sunucuya bağlanacak ve komut dosyasını çalıştıracak bir komut dosyasına sahip olmak için SQLCMD modunu ve :: connect komutunu kullanmaktır. Komut dosyasını kullanıcı için kaydederseniz ve komut dosyasını bir dosyadan yüklemek için: r komutunu kullanırsanız bu işe yarar.

Yapabileceğiniz başka bir şey, bir Central Management Server yapılandırmak ve daha sonra komut dosyanızı aynı anda birden fazla sunucuya çalıştırmaktır.


1
"Merkezi Yönetim Sunucusu". ah, şu anda kullanmadığım şey ...
gbn

evet, bu gibi şeyler için gizli bir mücevher, SQLCMD komut dosyalarından çok daha iyi.
SQLRockstar

2

Aslında, T-SQL içinden mümkündür, ancak belirli bir dizi koşulu karşılamanız ve birkaç çemberle atlamanız gerekir.

  • İlk olarak, sorguların çalıştırılacağı sunucuda uzak sorguları (OPENDATASOURCE / OPENROWSET) etkinleştirmeniz gerekir.
  • İkinci olarak, hedef sunucuların uzaktan erişime sahip olduğundan emin olmanız gerekir.
  • Üçüncü olarak, çalıştırılacak hedef sunucunun veritabanı motoruna T-SQL kodunu "enjekte edebilmeniz" için dinamik SQL kullanmanız gerekecektir.

SQL görevlerini otomatikleştirmek için CMS'den yararlanmanıza izin veren örnek bir komut dosyası aşağıdadır.

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

/* 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

Hayır USE Database. Bir bağlantı yazılabilir değil.

SSMS 2008 (?) Ve diğer araçlar "birden çok sunucuda çalışma" olanağı sunar. Üzgünüz, şu anki görevimde bu özelliği kullanmıyorum, bu yüzden bu problemi yaşamıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.