वास्तव में, यह T-SQL के भीतर से संभव है, लेकिन आप कुछ हुप्स के माध्यम से स्थिति और jumpt की एक निश्चित सेट को पूरा करने के लिए है।
- सबसे पहले, आपको उस सर्वर पर दूरस्थ क्वेरी (OPENDATASOURCE / OPENROWSET) को सक्षम करने की आवश्यकता है, जहां से क्वेरी को चलाया जाएगा।
- दूसरा, आपको यह सुनिश्चित करने की आवश्यकता है कि लक्ष्य सर्वर में दूरस्थ पहुंच सक्षम है।
- तीसरा, आपको गतिशील एसक्यूएल का भारी उपयोग करने की आवश्यकता होगी ताकि आप टी-एसक्यूएल कोड को लक्ष्य सर्वर के डेटाबेस इंजन में "इंजेक्ट" कर सकें।
यहां एक नमूना स्क्रिप्ट है जो आपको 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.