- PVSM.RU - https://www.pvsm.ru -
Привет!
Средние и крупные проекты, в которых целиком, либо значительная часть бизнес-логики реализована в хранимых процедурах СУБД, имеют ряд неудобств по управлению кодом модулей. А именно:
Да, есть коммерческие продукты, решающие эти проблемы полностью или частично, однако, на взгляд автора, делают это не эффективно и не элегантно. В виду этого, реализовано отображение модулей и структуры БД на файловую систему, с помощью FUSE [1] (Filesystem in Userspace), в проекте SQLFuse [2]. Теперь последователи Unix way [3] смогут пройти и здесь.
Рассмотрим последовательность действий для монтирования опытной БД.
Для сборки и монтирования понадобятся следующее ПО:
Убедитесь, что модуль ядра FUSE загружен:
modprobe -a fuse
После того, как софт установлен, необходимо клонировать репозитарий git:
git clone https://github.com/AlexandrMov/SQLFuse.git
Сборка проекта выполняется командами:
make clean
make
Если компиляция и сборка прошла успешно, далее необходимо настроить конфигурационный файл sqlfuse.conf, который находится в директории conf, клонированного репозитория:
# глобальная группа параметров, применяются ко всем профилям
[global]
# количество сеансов
maxconn=1
# наименование приложения, передаваемое при подключении к SQL Server
appname=SQLFuse
# пользовательский профиль подключения
[AdventureWorks2008R2]
# имя или адрес хоста/экземпляра SQL Server
servername=192.168.6.50
# база данных
dbname=AdventureWorks2008R2
# профиль авторизации, определённый в sqlfuse.auth.conf
auth=advauth
Параметр auth ссылается на имя группы, определённое в файле sqlfuse.auth.conf:
# пользовательский профиль авторизации
[advauth]
# логин пользователя
username=fuse
# пароль пользователя
password=123
Вместо параметра auth в файле sqlfuse.auth.conf допускается определение username и password в файле sqlfuse.conf. Этого не сделано нарочно, так как автор параноик при редактировании профилей подключений, кто-нибудь может подсмотреть пароль пользователя.
При указании экземпляра сервера, например, SQLServerSQLEXPRESS, символ "" можно не экранировать. Это верно и для параметра username, если необходимо авторизоваться через Active Directory.
Не забудьте про то, что БД AdwentureWorks2008R2 [4] должна быть подключена, и выбранный пользователь имеет все необходимые права для модификации модулей SQL Server.
Если у Вас возникают проблемы с кодировками, то попробуете использовать параметры to_codeset и from_codeset задающие направление конвертирования:
from_codeset=UTF-8
to_codeset=CP1251
При возникновении это ошибки:
Heterogeneous queries require the ANSI_NULLS and ANSI_WARNINGS options to be set for the connection. This ensures consistent query semantics. Enable these options and then reissue your query.
Используете параметр ansi_npw=true для принудительного включения опций QUOTED_IDENTIFIER, ANSI_NULLS, ANSI_WARNINGS, ANSI_PADDINGS в состояние ON:
Создадим папку advworks в корне клонированного репозитория SQLFuse [2] и смонтируем в неё нашу БД:
mkdir advworks
./sqlfuse -o profilename=AdventureWorks2008R2 ./advworks
Можно воспользоваться опцией -d, чтобы иметь возможность следить за ошибками, выдаемые SQL Server:
./sqlfuse -d -o profilename=AdventureWorks2008R2 ./advworks &> ./advworks.log &
Приведу для примера несколько простых действий над объектами сервера.
echo "COLUMN TestColumn NVARCHAR(50) NOT NULL" > ./Person/Person/TestColumn
rm ./Person/Person/TestColumn
cp ./HumanResources/uspUpdateEmployeeLogin ./dbo/uspUpdateEmployeeLogin
find ./ -maxdepth 2 -iname *Employee* -type f -print
Таким образом, управление и навигация по модулям становится как по обычным директориям с файлами: возможно применение систем управления версиями, патчей и любимых редакторов кода, то есть вся философия Unix налицо и для SQL Server.
имейте ввиду, что операция усечения (truncate) пока не поддерживается, — это значит, выполнить команду
echo " NOT NULL" >> TestColumn
не получится. Хотя и заблокировано на уровне файловой системы операция, но всё же не рекомендовал выполнять это, так как может привести к пересозданию колонки и потере данных!
Всегда сохраняйте оригиналы модулей перед редактированием!
Если вы ошиблись в описании модуля или произошёл разрыв соединения, файловая система вернёт ошибку -EFAULT («Не верный адрес»).
На момент, когда писался пост, SQLFuse поддерживал следующие модули для чтения/записи:
Только для чтения доступны схемы, таблицы, представления. Не отображаются совсем ограничения FOREIGN KEY, PRIMARY KEY и индексы. Когда появится больше свободного времени допишу и этот функционал.
Пришлось немного упростить синтаксис T-SQL, во избежания путаницы и более гибкого управления модулями. Все осталось прежним, за исключением того, что в определении ограничений и колонок убрана избыточность в описании таблицы. Определения будут выглядеть следующим образом:
/*ALTER TABLE Person.Person ADD/ALTER/DROP*/ COLUMN TestColumn DATETIME -- ...
/*ALTER TABLE Person.Person ADD/DROP*/ WITH CHECK CONSTRAINT CK_Test CHECK -- ...
/*ALTER TABLE Person.Person ADD/DROP*/ DEFAULT (GETDATE()) FOR (TestColumn) -- ...
В частях, где закомментированы указания о таблице назначения, SQLFuse сделает подстановку необходимого кода автоматически, исходя из местоположения файла модуля. Имя модуля, которое определено в тексте файла, не играет никакой роли, оно будет заменено на имя файла, схемы и/или таблицы по необходимости. В текстах модулей не может быть несколько пакетов команд, т.е. GO
По мере поступления свободного времени, в планах реализовать:
Кого заинтересовала идея и кто хочет принять участие в разработке, — милости просим: весь исходный код доступен под лицензией GPLv3. Автор будет рад любым замечаниям и предложениям.
P. S. Могу рассказать про опыт разработки файловой системы пользовательского режима на FUSE, если кому интересно.
Автор: Alexandr_M
Источник [10]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/63035
Ссылки в тексте:
[1] FUSE: http://fuse.sourceforge.net
[2] SQLFuse: https://github.com/AlexandrMov/SQLFuse
[3] Unix way: http://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%BB%D0%BE%D1%81%D0%BE%D1%84%D0%B8%D1%8F_UNIX
[4] AdwentureWorks2008R2: http://msftdbprodsamples.codeplex.com/releases/view/59211
[5] http://www.gnu.org/licenses/gpl-3.0.html: http://www.gnu.org/licenses/gpl-3.0.html
[6] http://freetds.org/: http://freetds.org/
[7] http://www.gnu.org/software/bison/: http://www.gnu.org/software/bison/
[8] http://flex.sourceforge.net/: http://flex.sourceforge.net/
[9] http://fuse.sourceforge.net/: http://fuse.sourceforge.net/
[10] Источник: http://habrahabr.ru/post/227185/
Нажмите здесь для печати.