Ở công việc mới của tôi, chúng tôi có nhiều phiên bản được đặt tên trên mỗi máy chủ. ví dụ
- Máy chủ1 \ Dev
- Máy chủ1 \ DevIntegrated
- Máy chủ1 \ QA
Tôi có một tập lệnh SQL PowerShell trong các tác phẩm gọi ra HĐH, gọi Foo.exe
nhưng cần truyền tham số dòng lệnh (chuỗi kết nối). Một công việc Tác nhân SQL sẽ tồn tại trên mỗi phiên bản, với một bước loại PowerShell, cần biết bối cảnh hiện tại là gì. tức là việc thực hiện này bắt đầu trên DevIntegrated.
Tôi không muốn có mọi kịch bản bắt đầu bằng ...
$thisInstance = "Dev"
... đặc biệt là vì tôi phải chỉnh sửa điều đó khi chúng tôi di chuyển sang môi trường (máy chủ mới và phiên bản được đặt tên) trong những tháng tới.
Nếu tôi khởi động SQLPS, tôi có thể xác định phiên bản của mình bằng cách cắt và cắt các kết quả của Vị trí lấy hoặc chạy
(Invoke-Sqlcmd -Query "SELECT @@servername AS ServerName" -SuppressProviderContextWarning).ServerName
Khi Tác nhân SQL bắt đầu công việc loại PowerShell, nó sẽ bắt đầu trong C: \ windows \ system32 và Get-Location
tuyến không hoạt động vì nó không nằm trong ngữ cảnh SQLSERVER. Tôi có thể thay đổi vào bối cảnh đó nhưng tôi sẽ ở "gốc" của SQL Server và sẽ không biết tôi nên sử dụng trường hợp nào. Sử dụng Invoke-Sqlcmd
tuyến sẽ không hoạt động vì lý do tương tự (về mặt kỹ thuật, nó xuất hiện ở đó không có ví dụ mặc định)
Theo hiểu biết tốt nhất của tôi, tôi đã liệt kê tất cả các "điều" cơ bản mà tôi có thể vào nhật ký công việc nhưng dường như không có gì hiển thị SQLSERVER:\SQL\Server1\DevIntegrated
Get-ChildItem
Get-Host
Get-Location
Get-Process
Get-PSDrive
Get-PSProvider
Get-Service
Get-TraceSource
Get-Variable
Get-Process
có vẻ như tôi có thể sử dụng điều đó và một số voodoo cố gắng kết hợp mọi thứ lại với nhau bằng cách đánh các trường hợp và các spids phù hợp nhưng điều đó nghe có vẻ như là một cuộc tấn công đẫm máu từ địa ngục. Phải có một cái gì đó cơ bản mà tôi đang thiếu, bất cứ ai cũng có thể làm sáng tỏ?
Các lựa chọn thay thế cho PowerShell đã điều tra
Tôi đã điều tra bằng cách sử dụng các loại công việc khác và không có được một giải pháp thỏa đáng. Nghiên cứu chỉ ra PowerShell được liệt kê trong SQL Agent là SQLPS và bắt đầu một thể hiện của nó bằng cách nhấp chuột phải vào Tác nhân tự động thả tôi vào đúng vị trí. Chỉ đến khi tôi dán mã tương tác của mình vào bước công việc thì tôi mới biết về sự khác biệt như đã đề cập trước đó.
Loại công việc của HĐH đưa tôi vào trạng thái giống hệt nhau ở chỗ tôi không thể tìm ra cách xác định trường hợp nào đưa tôi vào trình vỏ lệnh. Chắc chắn, tôi có thể sqlcmd và nhận được giá trị của @@servername
nhưng nếu tôi biết kết nối nào để bắt đầu sqlcmd, tôi sẽ không cần phải truy vấn cơ sở dữ liệu;)
TSQL có thể có thể hoạt động nếu chúng tôi kích hoạt xp_cmdshell
nhưng tôi không chắc liệu họ có bật nó không --- cơ sở chính phủ và họ có thể thấy khó chịu với các cài đặt không mặc định. Ngay cả khi đó, tôi vẫn bị mắc kẹt với SQL động và mất rất nhiều tính biểu cảm và sức mạnh mà PowerShell cho vay.
Mặc dù hơi vô duyên, tôi nghĩ rằng việc xác định một biến ở bước đầu tiên và chuyển nó sang các bước kế tiếp nhưng nghiên cứu đã đưa ra bài viết này Xử lý nhiều bước công việc (BOL)
Các bước công việc phải được khép kín. Nghĩa là, một công việc không thể vượt qua các giá trị Boolean, dữ liệu hoặc giá trị số giữa các bước công việc. Tuy nhiên, bạn có thể chuyển các giá trị từ một bước công việc Transact-SQL sang bước khác bằng cách sử dụng các bảng cố định hoặc các bảng tạm thời toàn cầu. Bạn có thể chuyển các giá trị từ các bước công việc chạy các chương trình thực thi từ bước này sang bước công việc khác bằng cách sử dụng tệp.
Tôi không thể sử dụng các thủ thuật phổ biến như cài đặt tệp / biến môi trường / sổ đăng ký nổi tiếng Foo.exe
tìm kiếm vì điều đó sẽ ngăn việc thực thi đồng thời trên các phiên bản.
TL; DR:
Trong bước Công việc Tác nhân SQL thuộc loại PowerShell, làm thế nào bạn có thể xác định phiên bản của Máy chủ SQL đã khởi chạy quy trình?