MicrosoftWindowsPowerShellvàSQLServer2005SMO–Phần3 Ngu ồn : quantrimang.com The MA K Phần I vàPhần II của loạt bài này đã chỉ dẫn các thiết lập PowerShellvà SMO, các cmdlet WMI đơn giản. Phần3 này sẽ giới thiệu cách viết mã cho cmdlet PowerShellvà thực thi chúng. Mã kịch bản là yếu tố cần thiết cho các thao tác tự động và lặp đi lặp lại. Chính sách thực thi 4 loại chính sách thực thi khác nhau của WindowsPowerShell là Restricted, AllSigned, RemoteSigned và Unrestricted. Chúng ta sẽ tìm chính sách thực thi của WindowsPowerShell trên vùng làm việc. [Hình 1.0] Cmdlet: Get-executionpolicy Kết quả: Restricted Hình 1.0 Giả sử ta có dòng code sau trên PowerShell script 'a.ps1'. [Hình 1.1] Echo “test” Hình 1.1 Nếu thử thực hiện mã lệnh khi chính sách thực thi của PowerShell là restricted, thì sẽ xuất hiện thông báo lỗi sau. [Hình 1.2] Lệnh thực hiện mã PowerShell . /a.ps1 Kết quả File C:\ps\a.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see "get-help about_signing" for more details. At line:1 char:3 + ./a <<<< Hình 1.2 Hãy thay đổi chính sách thực thi thành unrestricted. Lệnh thực hiện mã PowerShell đã có thể được thi hành bởi cmdlet sau. [Hình 1.3] Hình 1.3 Bây giờ hãy thử thực thi đoạn mã a.ps1 như hiển thị trong hình dưới đây. [Hình 1.4] Lệnh ./a Kết quả Test Hình 1.4 Điều khiển Input trong mã PowerShell Khi thực hiện các thao tác lặp đi lặp lại, chúng ta thích ứng dụng để tương tác hơn và xây dựng ứng dụng để đòi hỏi đầu vào từ người sử dụng. Ta có thể thực hiện t ương tự với PowerShell. Hãy tạo một mã PowerShell chấp nhận tên của trường SQLServervà tên cơ sở dữ liệu. Ngoài ra, hãy để PowerShell hiển thị tất cả các bảng trên cơ sở dữ liệu đó. Điều này có thể được thực hiện với cmdlet read-host. Thí dụ 1: [Hình 1.5] Read-host “Please Enter Second Number”. Hình 1.5 Thí dụ 2 Chúng ta có thể gán giá trị cmdlet là một biến số. [Hình 1.6] $a=read-host "Please Enter Second Number" $a Hình 1.6 Kết hợp thí dụ 1 và thí dụ 2 kết nối với SQL Server. Tạo mã PowerShell có tên connectsql.ps1. [Hình 1.7] $SQLSERVER=read-host "Enter SQLServer Name:" $Database=read-host "Enter Database Name:" $SqlConnection = New-Object System.Data.SqlClient.SqlConnection $SqlConnection.ConnectionString = "Server=$SQLSERVER;Database=$DATABASE;Integrated Security=True" $SqlCmd = New-Object System.Data.SqlClient.SqlCommand $SqlCmd.CommandText = "select name from sysobjects where type='u'" $SqlCmd.Connection = $SqlConnection $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter $SqlAdapter.SelectCommand = $SqlCmd $DataSet = New-Object System.Data.DataSet $SqlAdapter.Fill($DataSet) $SqlConnection.Close() $DataSet.Tables[0] Hình 1.7 Bây giờ hãy thực hiện mã connectsql.ps1 trên. [Hình 1.8] ./connectsql Enter SQLServer Name:: HOME\SQLEXPRESS Enter Database Name:: AdventureWorks Chú ý : HOME là máy chủ và SQLEXPRESS là tên ví dụ của SQL Server. Hãy thay thế tên này bằng tên máy chủ vàSQLServer của bạn. AdventureWorks là tên cơ sở dữ liệu. Bạn cũng chú ý thay thế tên cơ sở dữ liệu này cho tương ứng với tên cơ sở dữ liệu trên máy chủ. Hình 1.8 Mã connectsql gán giá trị được nhập vào các biến $SQLSERVER và $DATABASE, kết nối chuỗi sử dụng các biến đó và hiển thị ra kết quả. Kết quả: name ---- ProductProductPhoto StoreContact Address ProductReview TransactionHistory AddressType ProductSubcategory AWBuildVersion TransactionHistoryArchive ProductVendor BillOfMaterials UnitMeasure Vendor PurchaseOrderDetail Contact VendorAddress VendorContact PurchaseOrderHeader ContactCreditCard WorkOrder ContactType CountryRegionCurrency WorkOrderRouting CountryRegion CreditCard Culture Currency SalesOrderDetail CurrencyRate Customer SalesOrderHeader CustomerAddress Department Document Employee SalesOrderHeaderSalesReason SalesPerson EmployeeAddress EmployeeDepartmentHistory EmployeePayHistory SalesPersonQuotaHistory Illustration SalesReason Individual SalesTaxRate JobCandidate Location SalesTerritory Product SalesTerritoryHistory ScrapReason Shift ProductCategory ShipMethod ProductCostHistory ProductDescription ShoppingCartItem ProductDocument ProductInventory SpecialOffer ProductListPriceHistory SpecialOfferProduct ProductModel StateProvince ProductModelIllustration DatabaseLog ProductModelProductDescriptionCulture ErrorLog Store ProductPhoto Tuy nhiên, khi viết mã tự động, bạn không muốn người dùng nhập dữ liệu. Thay vào đó, ta nên chấp nhận các tham số. Hãy nâng cấp đoạn mã trên bằng cách chấp nhận các tham số.[Hình 1.9] param ( [string] $SQLSERVER, [string] $Database ) $SqlConnection = New-Object System.Data.SqlClient.SqlConnection $SqlConnection.ConnectionString = "Server=$SQLSERVER;Database=$DATABASE;Integrated Security=True" $SqlCmd = New-Object System.Data.SqlClient.SqlCommand $SqlCmd.CommandText = "select name from sysobjects where type='P'" $SqlCmd.Connection = $SqlConnection $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter $SqlAdapter.SelectCommand = $SqlCmd $DataSet = New-Object System.Data.DataSet $SqlAdapter.Fill($DataSet) $SqlConnection.Close() $DataSet.Tables[0] Hình 1.9 Thực hiện các đoạn mã như hình dưới. [Hình 2.0] Hình 2.0 connectsql gán các giá trị như một tham số tới các biến riêng biệt $SQLSERVER và $DATABASE, kết nối các chuỗi sử dụng các biến đó và hiển thị ra kết quả. Kết quả name ---- uspPrintError uspLogError uspGetBillOfMaterials uspGetEmployeeManagers uspGetManagerEmployees uspGetWhereUsedProductID uspUpdateEmployeeHireInfo uspUpdateEmployeeLogin uspUpdateEmployeePersonalInfo . Microsoft Windows PowerShell và SQL Server 2005 SMO – Phần 3 Ngu ồn : quantrimang.com The MA K Phần I và Phần II của loạt bài này. hợp thí dụ 1 và thí dụ 2 kết nối với SQL Server. Tạo mã PowerShell có tên connectsql.ps1. [Hình 1.7] $SQLSERVER=read-host "Enter SQL Server Name:"