| |||
|
|
Low-level stored procedures in Oracle and SQL Server 2005 Речь идёт о процедурах, хранящихся в базе данных и написанных не на SQL. Они делятся на два класса: 1) «Внутренние» -- исполняемые непосредственно сервером базы данных. 2) «Внешние» -- исполняемые операционной системой, на которой установлен сервер. Внутренние хранимые процедуры более безопасны и (по крайней мере, в Oracle) быстрее могут обмениваться данными с сервером. Внешние, зато, имеют доступ непосредственно к операционной системе (в обход сервера), и, само собой, их можно писать на C/C++. Поддержка хранимых процедур в Oracle и SQL Server
Оказалось, что в SQL Server 2005 можно писать низкоуровневые внешние процедуры на C/C++, «оборачивая» их внутренними, работающими в .NET CLR. Для этого нужно специальным образом настроить сервер, и указать, что обёртка «небезопасная»: CREATE ASSEMBLY [name] from [dll file] WITH PERMISSION_SET = UNSAFE; Сборкам типа UNSAFE позволено вызывать Win32 API, но не более того: низкоуровневые (unmanaged) вызовы вроде malloc() запрещены, поэтому делать обёртку на C++/CLI не имеет смысла.Но пользоваться механизмом P/Invoke разрешено! То есть, надо делать обёртку на C# и загружать dll-файл с C или C++-кодом с помощью DLLImport .Таким образом, низкоуровневые процедуры будут исполняться в адресном пространстве сервера, и при этом беспрепятственно смогут общаться с ОС. На все пользовательские сессии загружается одна копия библиотеки, т.е. она должна поддерживать multithreaded режим. В Oracle, кстати, наоборот -- на каждую сессию в памяти приходится отдельный экземпляр. Кстати, dll-файл, подлежащий импорту, вовсе не обязательно класть в директорию, прописанную в PATH . Здесь написано, как загрузить его из произвольной директории вызовомLoadLibrary() из kernel32.dll Добавить комментарий: |
|||||||||||||||||||||||||