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

7 sự thật về từ đồng nghĩa SQL Server bạn nên biết

Trước khi Từ đồng nghĩa SQL Server xuất hiện, mọi người đều muốn đơn giản hóa và nâng cao trải nghiệm cơ sở dữ liệu của họ.

Hãy tưởng tượng bạn có một ứng dụng với cơ sở dữ liệu tham chiếu đến cơ sở dữ liệu khác từ cùng một máy chủ. Sau đó, một cuộc cải tổ lớn buộc nhóm của bạn phải chuyển cơ sở dữ liệu khác sang máy chủ khác.

Chắc chắn ứng dụng của bạn sẽ bị hỏng. Nhưng bạn sẽ làm gì trong trường hợp đó? Liên kết 2 máy chủ và mã hóa cứng tất cả các tham chiếu (lại) để trỏ đến máy chủ mới?

Bạn có thể làm điều đó nếu bạn muốn và quên nếu bạn chỉ có một vài hoặc một tá tài liệu tham khảo về nó. Nhưng nếu một lần chuyển hoặc đổi tên khác xảy ra, bạn sẽ phải lặp lại cơn ác mộng tương tự.

Tuy nhiên, có một cách tốt hơn để giải quyết vấn đề này.

Giới thiệu từ đồng nghĩa SQL Server

Trước khi chúng ta đi sâu vào những gì bạn có thể làm với SQL Server Synonyms, hãy mô tả chúng là gì.

Từ đồng nghĩa trong bất kỳ ngôn ngữ nói và viết nào đề cập đến một từ hoặc cụm từ có cùng nghĩa với một từ hoặc cụm từ khác. Vì vậy, từ tuyệt đẹp là từ đồng nghĩa với đẹp hấp dẫn .

Tương tự như những gì chúng ta biết về từ đồng nghĩa của từ và cụm từ, SQL Server Synonyms đề cập đến tên thay thế của một đối tượng cơ sở dữ liệu nằm trong máy chủ cục bộ hoặc từ xa. Đọc thêm tại đây.

Như bạn sẽ thấy trong các sự kiện sau, SQL Server Synonyms có thể giúp bảo trì ứng dụng của bạn dễ dàng hơn rất nhiều.

Vì vậy, hãy bắt đầu!

1. Từ đồng nghĩa SQL Server có thể đơn giản hóa công việc của bạn khi các đối tượng cơ sở được chuyển hoặc đổi tên

Thứ nhất, chúng sẽ giúp bạn tránh khỏi những rắc rối về việc thay đổi mã khi cơ sở dữ liệu được chuyển đến một máy chủ khác hoặc đổi tên vì bất kỳ lý do gì. Hãy tham khảo tình huống mà chúng tôi đã đề cập trong phần mở đầu bài đăng này.

Một cuộc tổ chức lại lớn buộc nhóm của bạn phải thay đổi tham chiếu đến tất cả các đối tượng trong mydatabase2 vào prodserver2.mydatabase2.

Vì vậy, bạn truy vấn sys.sql_modules với tất cả các lần xuất hiện của mydatabase2 từ mydatabase1 .

USE mydatabase1
GO
SELECT
 b.name
,a.definition
,b.type_desc
FROM sys.sql_modules a
INNER JOIN sys.all_objects b on a.object_id = b.object_id
WHERE a.definition like '%mydatabase2%'
GO

Bây giờ, đầu ra của tập lệnh ở trên sẽ liệt kê tất cả các đối tượng có tham chiếu đến mydatabase2 . Đẹp đấy chứ hả? Và điều này sẽ giúp xác định phạm vi công việc phải thực hiện.

Nhưng đó mới chỉ là sự khởi đầu. Bạn cũng cần kiểm tra xem có mã nào trong ứng dụng khách của bạn hoặc bất kỳ mã nào khác tham chiếu giống nhau bên ngoài cơ sở dữ liệu của bạn hay không.

Số lượng mã bị ảnh hưởng cho thấy mức độ lớn của vấn đề mới của bạn.

Bây giờ, đây là một vài mẩu tin khác về những gì đang diễn ra trong tập lệnh đó:

  • sys.sql_modules bao gồm các đối tượng SQL là mô-đun do SQL định nghĩa như khung nhìn, thủ tục được lưu trữ, hàm, v.v.
  • Tên cột là tên của đối tượng.
  • Mã SQL cho đối tượng nằm trong định nghĩa cột sys.sql_modules .
  • sys.all_objects bao gồm tất cả các đối tượng trong cơ sở dữ liệu của bạn như bảng, dạng xem, v.v.
  • Chúng tôi đã sử dụng type_desc để xác định loại đối tượng đó là (chế độ xem, thủ tục được lưu trữ, v.v.)
  • ở đâu mệnh đề lọc truy vấn cho bất kỳ mã SQL nào có tham chiếu đến mydatabase2 .
  • Để có kết quả thỏa mãn bằng cách sử dụng tập lệnh ở trên, bạn cần có quyền cho tất cả các đối tượng. Kiểm tra với Quản trị viên cơ sở dữ liệu của bạn hoặc người nào đó có vai trò tương tự về việc này. Bạn cũng có thể kiểm tra điều này.

Giờ bạn đã biết cách xác định phạm vi công việc của mình, đã đến lúc sửa chữa nó.

Cách sửa lỗi mã này để nó không xảy ra nữa

Được rồi. Tôi có một lời thú nhận.

Việc sử dụng SQL Server Synonyms sẽ chỉ giảm thiểu các vấn đề của bạn đến mức tối thiểu, nhưng không loại bỏ chúng.

Tin tốt là:Nếu bạn có 10 tham chiếu đến một đối tượng từ xa trước khi sử dụng từ đồng nghĩa, bạn sẽ sửa đổi tất cả 10. Nhưng khi bạn bắt đầu sử dụng một từ đồng nghĩa cho đối tượng từ xa đó, thay vì sửa đổi 10 lần xuất hiện, bạn chỉ thay đổi 1. Không thay đổi gì nữa.

Bây giờ, đây là các bước để khắc phục điều này bằng cách sử dụng từ đồng nghĩa:

  1. Tạo một từ đồng nghĩa cho từng đối tượng từ xa. Vì vậy, thay vì prodserver2.mydatabase2.schema1.object1 bạn có thể tham khảo nó bằng cách sử dụng từ đồng nghĩa.
  2. Sửa đổi các tham chiếu đến từng đối tượng thành từ đồng nghĩa của nó.

Sau đó, bạn sẽ tìm hiểu chi tiết cụ thể về cách thực hiện việc này.

Kết luận:

Từ đồng nghĩa cung cấp một lớp trừu tượng để bảo vệ các tham chiếu đến các đối tượng cơ sở khỏi bất kỳ phần nào trong mã của bạn, cho dù bên trong cơ sở dữ liệu, ứng dụng khách hay bất kỳ nơi nào khác. Vì vậy, bạn có thể vui mừng khi một thay đổi khác xảy ra, cho dù đó là chuyển đối tượng hay đổi tên.

2. Bạn có thể tạo từ đồng nghĩa máy chủ SQL cho hầu hết các đối tượng

Tiếp theo, hãy tìm hiểu những đối tượng nào có thể có từ đồng nghĩa?

  • Bảng
  • Lượt xem
  • Thủ tục được lưu trữ
  • Chức năng

Bây giờ bạn đã biết các loại đối tượng, bạn có thể có ý tưởng về những gì bạn có thể làm với các từ đồng nghĩa. Hãy cùng tìm hiểu cụ thể hơn.

3. Bạn có thể ban hành các lệnh thích hợp cho từ đồng nghĩa đối tượng

Thứ ba, đây là một số lệnh cụ thể cho từng loại đối tượng.

Bảng

Bạn có thể thực hiện nhiều nhất có thể CHỌN, CHÈN, CẬP NHẬT và XÓA cho một bảng, bạn có thể thực hiện tương tự với từ đồng nghĩa của nó.

Vì vậy, thay vì:

SELECT * FROM prodserver2.mydatabase2.schema1.table1

Bạn có thể có một phiên bản ngắn hơn sẽ chống lại sự thay đổi tiếp theo:

SELECT * FROM synonym1

Vì đây là trường hợp, bạn cũng có thể làm điều này:

UPDATE synonym1
SET column1 = <value>

Và tương tự với CHÈN và XÓA.

Tuy nhiên, hãy lưu ý những điều sau:

  • Chèn một bản ghi mới thông qua một từ đồng nghĩa sẽ thêm một bản ghi mới vào bảng cơ sở. Trong trường hợp của chúng tôi, prodserver2.mydatabase2.schema1.table1 .
  • Việc cập nhật và xóa sẽ có cùng tác dụng.

Cho đến nay, chúng tôi chỉ hiển thị các lệnh DML. Còn các lệnh DDL như DROP thì sao?

Rất tiếc, bạn không thể thực hiện chúng. Đây là lý do tại sao:

Bỏ một từ đồng nghĩa sẽ không bỏ bảng cơ sở. Nó sẽ loại bỏ từ đồng nghĩa. Tôi sẽ đi vào chi tiết về vấn đề này trong giây lát.

Nhưng đây là một điều nữa bạn có thể làm đối với Từ đồng nghĩa của SQL Server của bảng:JOINs.

Làm thế nào thuận tiện này có thể được? Thay vì phát hành điều này:

SELECT
 a.column1
,b.column1
FROM table3 a
INNER JOIN prodserver2.mydatabase2.schema1.table1 b on a.id = b.id

Bạn có thể thực hiện điều này:

SELECT
 a.column1
,b.column1
FROM table3 a
INNER JOIN synonym1 b on a.id = b.id

Điều đó có đơn giản hơn không? Chắc chắn rồi!

Thủ tục được lưu trữ

Một lệnh liên quan mà bạn có thể thực hiện với từ đồng nghĩa của một thủ tục được lưu trữ là EXEC.

Vì vậy, thay vì gọi một thủ tục từ xa như thế này:

EXEC prodserver2.mydatabase2.schema1.spProcedure1

Bạn có thể tạo một từ đồng nghĩa cho quy trình trên. Hãy gọi nó là synProcedure1 . Và gọi nó theo cách này:

EXEC synProcedure1

Chúng ta sẽ tiếp tục chứ? Bạn có thể làm nhiều điều tương tự với CHẾ ĐỘ XEM và CHỨC NĂNG. Tất nhiên, nếu bạn có các quyền cần thiết. Nhưng trước tiên, hãy thảo luận về cách tạo Từ đồng nghĩa SQL Server.

4. Bạn có thể bắt đầu nhiệm vụ của mình với SQL Server Đồng nghĩa với CREATE

Chúng tôi đã đạt đến điểm về cách bạn có thể tạo từ đồng nghĩa. Dưới đây là cách chúng tôi có thể làm điều đó bằng T-SQL cho một bảng:

CREATE SYNONYM synonym1 FOR prodserver2.mydatabase2.schema1.table1

Nhưng hãy lưu ý điều này:

Kiểm tra sự tồn tại và quyền đối với mydatabase2.schema1.table1 trong prodserver2 được hoãn lại cho đến thời gian chạy.

Điều đó có nghĩa là bạn sẽ không biết nếu:

  • 2 máy chủ ( prodserver1 prodserver2 ) đã được liên kết.
  • cơ sở dữ liệu mydatabase2 , lược đồ schema1 và bảng table1 thực sự tồn tại.
  • quyền truy cập của bạn vào các tài nguyên đó được cho phép.

Vì vậy, sau khi tạo từ đồng nghĩa, hãy kiểm tra nó bằng cách chạy các lệnh mà bạn mong đợi để hoạt động.

Và với các thủ tục, chế độ xem và chức năng được lưu trữ, bạn nên hành động theo cách tương tự.

Nhưng đó không phải là tất cả. Nếu chúng tôi có thể tạo một từ đồng nghĩa, chúng tôi cũng có thể xóa nó bằng cách sử dụng:

DROP SYNONYM synonym1

Và đây là một lưu ý khác:Vì bạn có thể bỏ từ đồng nghĩa bất cứ lúc nào nên các tham chiếu đến từ đồng nghĩa bị loại bỏ sẽ chỉ được kiểm tra trong thời gian chạy.

Vì vậy, trước khi bỏ một từ đồng nghĩa, hãy kiểm tra sys.sql_modules nếu có bất kỳ tham chiếu nào đến nó.

Sử dụng SQL Server Management Studio (SSMS) để tạo và thả từ đồng nghĩa

Cho đến nay, chúng tôi đã sử dụng T-SQL để tạo và bỏ từ đồng nghĩa SQL Server. Bạn có thể thích sử dụng giao diện đồ họa hơn khi làm tương tự.

Hãy cùng bóng lăn.

Tạo từ đồng nghĩa

Nếu việc nhập các lệnh không phải là việc của bạn, thì đây là các bước cần làm khi tạo từ đồng nghĩa:

  1. Chạy SSMS và đăng nhập vào Máy chủ SQL của bạn.
  2. Tìm cơ sở dữ liệu mà bạn muốn tạo từ đồng nghĩa.
  3. Mở rộng nó.
  4. Nhấp chuột phải vào Từ đồng nghĩa và chọn Từ đồng nghĩa mới .
  5. Điền vào biểu mẫu với thông tin cần thiết cho các từ đồng nghĩa, bao gồm tên, giản đồ, v.v.
  6. Nhấp vào OK .

Dưới đây là ảnh chụp màn hình của biểu mẫu trong SSMS:

Bỏ từ đồng nghĩa

Nói về sở thích, tôi thích gõ các lệnh để tạo từ đồng nghĩa. Nhưng thả chúng theo ý muốn đơn giản hơn là gõ lệnh. Tất nhiên, đó chỉ là ý thích của tôi. Dù sao, dưới đây là các bước cần thực hiện khi bỏ một từ đồng nghĩa:

  1. Chạy SSMS và đăng nhập vào Máy chủ SQL của bạn.
  2. Tìm cơ sở dữ liệu nơi chứa từ đồng nghĩa bạn muốn bỏ.
  3. Mở rộng nó.
  4. Mở rộng Từ đồng nghĩa thư mục.
  5. Tìm từ đồng nghĩa bạn muốn bỏ.
  6. Nhấp chuột phải vào từ đồng nghĩa bạn muốn bỏ và chọn Xóa .
  7. Nhấp vào OK .

Để tóm tắt các bước ở trên, chỉ cần nhấp chuột phải vào từ đồng nghĩa cần thả, sau đó chọn Xóa và cuối cùng, nhấp vào OK .

Dưới đây là ảnh chụp màn hình của cửa sổ sẽ xuất hiện trước khi xác nhận xóa:

5. Bạn có thể bảo mật các từ đồng nghĩa của SQL Server

Sử dụng GRANT, DENY hoặc REVOKE, bạn có thể kiểm soát quyền truy cập vào một từ đồng nghĩa.

CẤP quyền CHỌN cho từ đồng nghĩa từ đồng nghĩa1 cho người dùng có tên testuser , bạn làm như sau:

GRANT SELECT ON synonym1 to testuser

Các quyền khác mà bạn có thể thêm vào hoặc xóa khỏi một từ đồng nghĩa như sau:

  • KIỂM SOÁT
  • THỰC HIỆN
  • CẬP NHẬT
  • CHÈN
  • XÓA
  • XEM ĐỊNH NGHĨA
  • LẤY QUYỀN SỞ HỮU

6. Không thể tìm thấy Bảng, Chế độ xem hoặc Quy trình đó? Nó có thể là một từ đồng nghĩa

Một trong những vấn đề mà người mới trong nhóm của bạn có thể gặp phải là bảng, chế độ xem, thủ tục hoặc chức năng “bị thiếu”. Tất nhiên, nếu SELECT được cấp trên một đối tượng, nó có thể là một bảng hoặc dạng xem. Nhưng anh ấy không thể tìm thấy nó trong danh sách bảng hoặc danh sách chế độ xem. Và nếu anh ấy không sử dụng SQL Server Synonyms trước đây, đó là một vấn đề khác.

Thiếu định hướng, lỗ hổng trong tài liệu hoặc lỗ hổng trong tiêu chuẩn của bạn có thể được sắp xếp theo thứ tự. Đây là một tập lệnh tiện lợi sẽ giúp bạn trình bày danh sách các từ đồng nghĩa và đối tượng cơ sở của nó cho thành viên mới trong nhóm của bạn:

SELECT
 a.[name]
,a.[base_object_name]
,OBJECTPROPERTYEX(OBJECT_ID(a.[name]), 'BaseType') as BaseType
,b.type_desc
FROM sys.synonyms a
INNER JOIN (SELECT DISTINCT type, type_desc from sys.all_objects) b on 
           CONVERT(varchar(2),OBJECTPROPERTYEX(OBJECT_ID(a.[name]), 'BaseType')) = b.type

Một đối tượng "bị mất tích"? Không còn nữa nếu nó là một từ đồng nghĩa.

Nhưng trước khi hào hứng với việc chạy tập lệnh này, đây là một số điều bạn nên tính đến:

  • sys.synonyms là nơi tất cả các Từ đồng nghĩa của SQL Server được xác định trong cơ sở dữ liệu hiện tại.
  • Chúng tôi đã lấy các loại và mô tả loại ( loại type_desc tương ứng) trong sys.all_objects . Nếu bạn có ý tưởng hay hơn ngoài việc kết hợp họ với một truy vấn phụ, vui lòng cho tôi biết.
  • OBJECTPROPERTYEX được sử dụng để lấy kiểu của đối tượng cơ sở nếu đó là một bảng, thủ tục được lưu trữ hoặc cách khác.
  • Cuối cùng, nếu bạn không có quyền tối thiểu cần thiết để thực thi tập lệnh này và nhận được kết quả mong muốn, đã đến lúc kết bạn với DBA của bạn hoặc ai đó có vai trò tương tự :)

Nhưng bạn có thể tự hỏi, tại sao lại làm tất cả những điều này nếu nó không hoạt động tốt?

7. Từ đồng nghĩa SQL Server có ảnh hưởng đến hiệu suất không?

Đây là một mối quan tâm chung. Và để hiểu rõ những gì đang diễn ra đằng sau hậu trường, hãy cùng xem tóm tắt những gì sẽ xảy ra trong kế hoạch thực hiện:

  1. Khi thực thi mã đơn giản nhất với từ đồng nghĩa (ví dụ:SELECT * từ từ đồng nghĩa1), SQL Server sẽ bước vào giai đoạn liên kết trong đó đối tượng cơ sở sẽ thay thế từ đồng nghĩa.
  2. Tiếp theo, bất kỳ kế hoạch tối ưu hóa tốt nhất nào có để thực hiện lệnh cho đối tượng cơ sở, nó sẽ giống nhau.

Dưới đây là một số câu hỏi và câu trả lời liên quan đến 2 câu trên:

  1. SQL Server thực hiện giai đoạn liên kết trong bao lâu? TRẢ LỜI:Không mất nhiều thời gian. Nó thường xảy ra trong nháy mắt.
  2. Nếu bước tiếp theo sử dụng cùng một kế hoạch tối ưu hóa tốt nhất với đối tượng cơ sở và truy vấn đến đối tượng cơ sở "đủ nhanh", thì nó có chậm hơn không? TRẢ LỜI:Không, vì nó sẽ sử dụng cùng một kế hoạch thực thi.
  3. Làm thế nào về xác thực từ máy chủ mới? TRẢ LỜI:Nếu có một số chậm trễ nhỏ do việc chuyển cơ sở dữ liệu sang máy chủ mới, chúng không phải do từ đồng nghĩa gây ra. Hiệu suất truy vấn khi gọi nó bằng cách sử dụng từ đồng nghĩa hoặc mã cứng server.database.schema.object nên giống nhau vì từ đồng nghĩa chỉ là một tên thay thế cho đối tượng cơ sở. Giải quyết hiệu suất chậm từ đối tượng cơ sở.

Nhưng đừng nghe lời tôi. Bạn nên tự mình kiểm tra nó với kế hoạch thực thi truy vấn và hiệu suất thực tế của mình.

Kết luận

Nói chung, chúng tôi đã đề cập đến khá nhiều thông tin về Từ đồng nghĩa SQL Server, vì vậy hãy tóm tắt lại.

Thứ nhất, một từ đồng nghĩa chỉ đơn giản là một tên thay thế sẽ giúp bạn tránh được việc thay đổi và chuyển tên đối tượng. Thứ hai, các ứng cử viên tốt cho các từ đồng nghĩa là các bảng, các khung nhìn, các thủ tục được lưu trữ và các hàm. Tiếp theo, bạn có thể thực hiện các lệnh phù hợp với đối tượng cơ sở của nó từ một từ đồng nghĩa. Bạn cũng có thể bảo mật nó. Sau đó, nếu bạn cần xem danh sách các từ đồng nghĩa, bạn có sys.synonyms để giúp bạn. Cuối cùng, hiệu suất sẽ không gặp nhiều rắc rối nếu không có vấn đề về hiệu suất với đối tượng cơ sở.

Vậy tại sao không thử ngay hôm nay?

Bạn nghĩ sao? Hãy cho chúng tôi biết trong phần bình luận.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server Internals:Các toán tử có vấn đề Pt. III - Các loại

  2. Mã khung thực thể đầu tiên với từ đồng nghĩa SQL Server

  3. Cách lấy lịch Quý từ một ngày trong TSQL

  4. Cách tạo cơ sở dữ liệu trong SQL Server bằng TSQL hoặc GUI - Hướng dẫn SQL Server / TSQL Phần 24

  5. hành vi nối nvarchar / chỉ mục / nvarchar (tối đa) không thể giải thích được