Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tích hợp CLR SQL Server có hỗ trợ tệp cấu hình không?

Bạn cần đặt sqlservr.exe.config tệp trong \ Binn thư mục của thư mục gốc của phiên bản đó. Ví dụ:

C:\ Program Files \ Microsoft SQL Server \ MSSQL11.MSSQLSERVER \ MSSQL \ Binn

Nếu bạn đang sử dụng SQL Server 2008 R2 (SP1) hoặc mới hơn, bạn sẽ có thể tìm thấy vị trí chính xác thông qua truy vấn sau, truy vấn này hiển thị đường dẫn đầy đủ đến sqlservr.exe :

SELECT [filename] FROM sys.dm_server_services WHERE servicename LIKE N'SQL Server (%';

Trong mã của bạn, bạn cần dòng này ở trên cùng:

using System.Configuration;

Và sau đó điều này sẽ hoạt động:

[SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true)]
public static SqlString GetConfig(SqlString WhichOne)
{
    ConfigurationManager.RefreshSection("connectionStrings");
    return ConfigurationManager.ConnectionStrings[WhichOne.Value].ToString();
}

Nội dung của sqlservr.exe.config tệp:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <connectionStrings>
      <add name="Stuff" connectionString="Trusted_Connection=true; Enlist=false;" />
      <add name="ClrTest" connectionString="boo hoo" />
   </connectionStrings>
</configuration>

Điều quan trọng cần lưu ý là, như đã nêu trong liên kết "Sử dụng cấu hình ứng dụng ...", các thay đổi được thực hiện đối với tệp cấu hình không có sẵn ngay lập tức. TUY NHIÊN , bạn không không cần buộc tải lại bằng cách thực hiện một trong các phương pháp được đề cập trong bài viết đó (tức là DBCC FREESYSTEMCACHE và khởi động lại SQL Server). Tất cả những gì cần thiết để có được thông tin hiện tại là tải lại phần cụ thể mà bạn đang sử dụng thông qua ConfigurationManager.RefreshSection (string sectionName) như được hiển thị trong ví dụ trên. Vui lòng xem ghi chú bên dưới về cách sử dụng và hiệu suất.

Tài nguyên:

  • Sử dụng System.Configuration.dll trong .NET mầm và UDFs
  • Sử dụng tệp cấu hình ứng dụng (app.config / web.config) trong tích hợp CLR máy chủ SQL

Ngoài ra, trừ khi bạn thực sự cần thiết, bạn không nên tạo hội đồng của mình dưới dạng UNSAFE . Nếu bạn chỉ đang cố gắng tạo kết nối TCP với các máy khác, điều đó sẽ chỉ yêu cầu EXTERNAL_ACCESS .

SỬ DỤNG VÀ HIỆU SUẤT

Theo đề xuất của Joe B trong nhận xét bên dưới, có một chút ảnh hưởng đến hiệu suất cho RefreshSection hoạt động. Nếu mã chứa làm mới sẽ được gọi nhiều hơn một lần trong vài phút, thì nó có thể có tác động đáng chú ý (tác động không cần thiết do thiếu tần suất thay đổi tệp cấu hình). Trong trường hợp này, bạn sẽ muốn xóa lệnh gọi đến RefreshSection từ mã được gọi thường xuyên và xử lý việc làm mới một cách độc lập.

Một cách tiếp cận sẽ là có một Thủ tục lưu trữ SQLCLR hoặc Hàm vô hướng chỉ thực hiện việc làm mới và không làm gì khác. Điều này có thể được thực thi bất cứ khi nào nó thực hiện thay đổi đối với tệp cấu hình.

Một cách tiếp cận khác là dỡ bỏ Miền ứng dụng sẽ tải lại tệp cấu hình vào lần tiếp theo bất kỳ đối tượng SQLCLR nào trong cơ sở dữ liệu đó được tham chiếu. Một phương pháp khá đơn giản để tải lại tất cả các Miền ứng dụng trong một Cơ sở dữ liệu cụ thể (nhưng không phải trên toàn bộ Phiên bản) là lật TRUSTWORTHY cài đặt Bật rồi lại Tắt, hoặc Tắt rồi Bật lại, tùy thuộc vào trạng thái hiện tại của cài đặt đó. Đoạn mã dưới đây sẽ kiểm tra trạng thái hiện tại của cài đặt đó và lật nó cho phù hợp:

IF (EXISTS(
    SELECT  sd.*
    FROM    sys.databases sd
    WHERE   sd.[name] = DB_NAME() -- or N'name'
    AND     sd.[is_trustworthy_on] = 0
   ))
BEGIN
    PRINT 'Enabling then disabling TRUSTWORTHY...';
    ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
    ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
END;
ELSE
BEGIN
    PRINT 'Disabling then enabling TRUSTWORTHY...';
    ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
    ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
END;

Làm ơn không sử dụng bất kỳ phương pháp nào mạnh hơn - DBCC FREESYSTEMCACHE , vô hiệu hóa sau đó bật clr enabled cài đặt hệ thống, khởi động lại Phiên bản, v.v. - vì hầu như không cần thiết phải làm như vậy. Đặc biệt là khởi động lại Phiên bản hoặc DBCC FREESYSTEMCACHE cái nào giảm tất cả dữ liệu được lưu trong bộ nhớ cache cho toàn bộ Phiên bản, điều này ảnh hưởng nhiều hơn đến SQLCLR.

CẬP NHẬT VỀ MÁY CHỦ SQL TRÊN LINUX

SQL Server hiện tại, bắt đầu từ phiên bản 2017, có sẵn trên Linux (tuyệt vời!). Tuy nhiên, có vẻ như việc đọc từ tệp cấu hình ứng dụng không hoạt động trên Linux. Tôi đã thử nhiều cách kết hợp sqlservr.exe.[Cc]onfigsqlservr.[Cc]onfig , v.v., và những thứ tương tự và không có gì để làm việc. Việc chỉ định tệp cấu hình không thể hoạt động vì yêu cầu EXTERNAL_ACCESS quyền và chỉ SAFE Assemblies được phép trên Linux (ít nhất là ngay bây giờ). Nếu tôi tìm được cách để nó hoạt động, tôi sẽ đăng thông tin chi tiết tại đây.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thiết kế cơ sở dữ liệu:một bảng lớn hay các bảng riêng biệt?

  2. Tạo tên bảng là các từ / từ khóa dành riêng trong MS SQL Server

  3. DateTime2 so với DateTime trong SQL Server

  4. Không sử dụng sys.sql_dependencies trong SQL Server (nó không được dùng nữa)

  5. Những hạn chế đối với SQL Server Compact là gì? (Hoặc - làm thế nào để người ta chọn một cơ sở dữ liệu để sử dụng trên nền tảng MS?)