2010-04-29 27 views
9

Chúng ta có hàm vô hướng trả về một DateTime. Nó thực hiện một vài bảng nhanh chóng lựa chọn để có được giá trị trả về của nó. Hàm này đã được sử dụng trong toàn bộ cơ sở dữ liệu - trong các ràng buộc mặc định, procs được lưu trữ, v.v. Tôi muốn thay đổi việc thực thi hàm (để loại bỏ các lần truy cập bảng và làm cho nó hiệu quả hơn) nhưng dường như tôi không thể làm điều đó trong khi nó được tham chiếu bởi các đối tượng khác trong cơ sở dữ liệu. Tôi có thực sự cần phải cập nhật hoặc thả mọi đối tượng trong cơ sở dữ liệu tham chiếu đến nó, cập nhật hàm và sau đó cập nhật hoặc tạo lại tất cả các đối tượng đó để khôi phục tham chiếu đến hàm không?
Chức năng đang được tham chiếu bởi một số ít lượt xem, trình kích hoạt, một vài chức năng và một số lượng lớn các ràng buộc mặc định và các procs được lưu trữ.SqlServer2008 - Tôi có thể thay đổi chức năng vô hướng trong khi nó được tham chiếu ở nhiều nơi

Cảm ơn bạn đã có bất kỳ thông tin chi tiết nào bạn có thể cung cấp.

Các lỗi tôi nhận được khi tôi cố gắng trong hai Alter hoặc Thả chức năng là:

Không thể [ALTER | thả CHỨC NĂNG] 'dbo.GetClientCurrentTime' vì nó đang được tham chiếu bởi đối tượng 'DF_tbl_PatientOrder_Note_RecordCreated' .

+0

Nếu bạn đang sử dụng nó trong các cột có nguồn gốc, bạn sẽ cần tạm thời thả các cột. Sử dụng trong procs lưu trữ không cần phải được sửa đổi. Không chắc chắn về việc sử dụng các ràng buộc mặc định. –

+0

* dường như tôi không thể làm điều đó trong khi nó được tham chiếu bởi các đối tượng khác trong cơ sở dữ liệu * - bạn đang gặp lỗi gì và khi nào? – egrunin

Trả lời

0

Điều đó tùy thuộc. Nếu các đối tượng tham chiếu hàm có tùy chọn WITH SCHEMABINDING thì bạn sẽ bị ngăn cản một cách rõ ràng khỏi chức năng của mình. Nếu không, hạn chế duy nhất là hạn chế khóa truy cập DDL bình thường, có nghĩa là các kế hoạch thực thi sử dụng hàm sẽ đặt khóa ổn định lược đồ trên hàm và điều này sẽ chặn các câu lệnh ALTER FUNCTION của bạn, vì chúng yêu cầu khóa sửa đổi lược đồ. Nhưng điều này sẽ tự giải quyết khi kế hoạch kết thúc thực hiện.

+0

Tôi đã thêm lỗi tôi đang gặp phải vào phần thân của câu hỏi. Tôi đã tra cứu SCHEMABINDING trong tài liệu và không thể tìm cách xác định xem nó có được bật cho một đối tượng hay tắt nó cho một đối tượng hay không. Bạn có mong đợi thông báo lỗi cho biết vấn đề có liên quan đến SCHEMABINDING không? Bạn có biết cách tắt nó đi không? Cảm ơn sự giúp đỡ của bạn. –

+0

'DF_tbl_PatientOrder_Note_RecordCreated' là gì? Một hàm khác, một cột có nguồn gốc, một ràng buộc kiểm tra? –

+0

DF_tbl_PatientOrder_Note_RecordCreated là ràng buộc mặc định. Chức năng này chỉ được tham chiếu bởi một số ít các khung nhìn, trình kích hoạt, một vài hàm và một số lượng lớn các ràng buộc mặc định và các procs được lưu trữ. –

-1

Nếu thông số đầu vào và loại đầu ra không thay đổi, bạn sẽ có thể thực hiện bất kỳ sửa đổi nội bộ nào mà bạn cần thực hiện mà không gây ra bất kỳ sự cố nào.

+0

Đó chắc chắn là những gì tôi nghĩ. Trong thực tế, tôi cũng có thể tạo ra những thay đổi đột phá - với kết quả là tôi đã phá vỡ nó. Nhưng đơn giản là không thể thay đổi chức năng, thời gian? Điều đó có vẻ giống như một hạn chế khá vô lý. Vì vậy, tôi hình tôi chỉ cần bỏ lỡ một số vòng để nhảy qua đó sẽ cho phép tôi thay đổi hoặc thả chức năng. –

+0

Thực ra, sai. Nếu hàm có 'WITH SCHEMABINDING' và một số đối tượng tham chiếu đến nó, bạn sẽ không thể chạy bất kỳ thay đổi nào trên nó ... –

Các vấn đề liên quan