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

Cách kiểm tra xem T-SQL UDF có bị ràng buộc bởi giản đồ hay không (Ngay cả khi nó được mã hóa)

Lược đồ ràng buộc một đối tượng chẳng hạn như hàm do người dùng xác định (UDF) được coi là phương pháp hay, vì nó ngăn chặn các thay đổi được thực hiện đối với bất kỳ đối tượng nào mà nó tham chiếu có thể vô tình phá vỡ hàm.

Bạn có thể liên kết lược đồ với một hàm do người dùng xác định tại thời điểm bạn tạo nó hoặc bạn có thể thay đổi sau này.

Thông thường, bạn có thể kiểm tra xem một UDF có bị ràng buộc với lược đồ trong SQL Server hay không bằng cách xem định nghĩa của nó. Bạn thường có thể thực hiện việc này thông qua GUI bằng cách chọn “Script as Create” hoặc tương tự.

Bạn cũng có thể làm điều đó bằng T-SQL bằng cách chọn definition cột của sys.sql_modules chế độ xem danh mục hệ thống.

Nhưng điều này sẽ chỉ hoạt động nếu UDF không được mã hóa.

Tuy nhiên, có một cột khác trong sys.sql_modules xem phục vụ mục đích của chúng tôi cho dù UDF có được mã hóa hay không:is_schema_bound

Ví dụ 1 - UDF được mã hóa

Dưới đây là một ví dụ về việc tìm hiểu xem một hàm được mã hóa do người dùng xác định có tên là udf_CatsByName_ITVF hay không lược đồ có bị ràng buộc hay không.

SELECT 
  definition,
  is_schema_bound
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');

Kết quả:

+--------------+-------------------+
| definition   | is_schema_bound   |
|--------------+-------------------|
| NULL         | 1                 |
+--------------+-------------------+

Trong trường hợp này, UDF bị ràng buộc lược đồ.

Cũng lưu ý rằng definition cột trả về NULL vì hàm đã được áp dụng mã hóa.

Ví dụ 2 - UDF Không có Mã hóa

Nếu mã hóa không được áp dụng, chúng tôi có thể thấy định nghĩa đầy đủ trong cột đó và chúng tôi sẽ thấy đối số WITH SCHEMABINDING trong định nghĩa.

Đây là truy vấn lại khi hàm không được mã hóa.

SELECT 
  definition
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');

Kết quả:

+--------------+
| definition   |
|--------------|
| 
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
    RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN (
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @CatName
    );

              |
+--------------+

Tôi đã xóa is_schema_bound từ truy vấn để dễ đọc hơn.

Dù bằng cách nào, is_schema_bound cột có thể được sử dụng cho dù UDF có được mã hóa hay không.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mô hình quan hệ

  2. Toán tử SQL

  3. Phân tích dữ liệu lớn với công cụ Microsoft Azure

  4. Gấu trúc:Cách đọc và ghi tệp

  5. Cách sử dụng chính của sys.dm_os_wait_stats