2009-05-13 24 views
7

Tôi đang làm việc trên một thủ tục lưu trữ CLR dựa trên LINQ để lọc và thao tác phức tạp, nếu không sẽ yêu cầu nhiều mã T-SQL lộn xộn và kém hiệu quả, nếu được thực hiện trong một thủ tục lưu trữ "truyền thống" hơn.CLR Thủ tục lưu trữ: cách đặt lược đồ/chủ sở hữu?

Điều này hoạt động tốt, nhưng tôi không thể tìm cách đặt lược đồ của Quy trình được lưu trữ này trong giai đoạn triển khai, để tổ chức và tách đối tượng cơ sở dữ liệu tốt hơn trong mô-đun.

Bất kỳ ý tưởng nào?

Rất cám ơn trước.

+0

Đòi hỏi này, như xa như nó liên quan đến việc thiết Schema trong Visual Studio/triển khai SSDT, là lỗi thời như của VS 2012. Vui lòng xem các ** CẬP NHẬT ** phần ở đầu câu trả lời dưới đây: http: // stackoverflow.com/a/4597610/577765 –

Trả lời

2

Khi bạn tạo quy trình tham chiếu đến assembly, bạn có thể tạo trình bao bọc này được sở hữu bởi bất kỳ lược đồ nào bạn muốn. Xem This MSDN article on deploying CLR stored procedures để có hướng dẫn về cách triển khai quy trình được lưu trữ. Bằng cách thay đổi tuyên bố tạo ra thủ tục để một cái gì đó như:

CREATE SCHEMA foo 

CREATE PROCEDURE foo.hello 
AS 
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld 

Bây giờ bạn có thể có một thủ tục thuộc sở hữu của schema foo.

+0

Rất cám ơn. Tôi đã tìm thấy bài viết đó và tôi có thể xem nó như là một cách giải quyết, nhưng tôi đã tự hỏi liệu có bất kỳ thay thế khác mà sẽ không yêu cầu một wrapper hoặc anyway một đối tượng thứ hai. Bạn có nhận thức được bất kỳ hoặc là đây là khả năng thực tế duy nhất? Một lần nữa, cảm ơn cho trả lời nhanh chóng :) –

+0

SQL wrapper là một phần cần thiết. Bạn phải làm điều đó anyway - nó là một phần không thể thiếu trong việc triển khai các thủ tục lưu sẵn CLR. – ConcernedOfTunbridgeWells

+0

Rất cám ơn và xin lỗi vì sự chậm trễ, đã bận rộn với điều gì đó khác trong thời gian chờ đợi. Tôi không triển khai nữa trực tiếp từ Visual Studio. Thay vào đó, tôi đang triển khai thông qua các kịch bản, vì vậy tôi có thể dễ dàng xác định schema Tôi muốn bằng cách sử dụng một wrapper, như bạn đề nghị. Rất cám ơn một lần nữa vì sự giúp đỡ của bạn. –

9

CẬP NHẬT: Trong Visual Studio 2012, điều này có thể được thực hiện thông qua cửa sổ thuộc tính dự án của "Dự án cơ sở dữ liệu SQL Server". Thuộc tính có liên quan là "Lược đồ mặc định" trên tab "Cài đặt dự án". Việc sửa đổi giá trị này sửa đổi kịch bản triển khai được tạo ra để đặt tên lược đồ ở trước các hàm, các thủ tục lưu sẵn, vv .. Hãy chắc chắn thêm đối tượng Schema vào dự án của bạn có cùng tên hoặc bạn sẽ gặp lỗi xây dựng.


Tôi không biết những gì phiên bản của Visual Studio bạn đang sử dụng, nhưng khi bạn tạo một dự án thủ tục CLR được lưu trữ trong Visual Studio 2010, dự án bao gồm hai kịch bản SQL: PreDeploymentScript.sql và PostDeploymentScript.sql.

Chúng tôi chỉ sử dụng những điều này để hướng dẫn mọi thứ theo cách chúng tôi muốn.

Trong kịch bản trước khi triển khai, chúng tôi có một cái gì đó như thế này:

-- DROP EXISTING ITEM FROM CURRENT SCHEMA 
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Utilities].[fn_Create_Md5_Hash]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT')) 
DROP FUNCTION [Utilities].[fn_Create_Md5_Hash] 
GO 

Sau đó, trong kịch bản sau triển khai, chúng tôi có điều này:

-- DEPLOYMENT WIZARD RECREATES ITEM IN dbo SCHEMA 
-- DROP NEW ITEM FROM dbo SCHEMA 
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_Create_Md5_Hash]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT')) 
DROP FUNCTION [dbo].[fn_Create_Md5_Hash] 
GO 

-- RECREATE THE ITEM BACK IN THE SCHEMA YOU WANT 
CREATE FUNCTION [Utilities].[fn_Create_Md5_Hash](@source [varbinary](max)) 
RETURNS [varbinary](8000) WITH EXECUTE AS CALLER 
AS 
EXTERNAL NAME [NameSpace].[UserDefinedFunctions].[fn_Create_Md5_Hash] 
GO 

Hy vọng rằng sẽ giúp!

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