Друзья, кто из вас организовывал хранение файлов при помощи FileStream?
Если да, то не могли бы вы поделиться опытом?
Рассказать в чем плюсы и минусы?
И как можно перейти от хранения файлов в таблице tbl_Files к хранению файлов в файловой системе при помощи file stream?

Нравится

14 комментариев

Вот есть хорошая статья по организации FileStream
http://blogs.msdn.com/b/alexejs/archive/2009/06/03/filestream.aspx
Основное достоинство этой технологии - это то что объем хранимой информации не влияет на общий объем БД, а следовательно можно пользоваться MS SQL Server 2008 R2 Express Edition бесплатно еще какое-то время, пока база не станет объемом 4 Gb.

Туда бы еще и содержимое tbl_MailMessage отправить:smile:

Основной размер писем составляют аттачи. В новой версии почтового клиента аттачи вынесены в tbl_Files. Именно с этой целью. :wink:

"Евгений Либин" написал:В новой версии почтового клиента

кстати сразу еще один дополнительный + к выбору именно вашей версии выходит при условии реализации внешнего хранения файлов - убираем из бюджета Outlook и полновесный SQL server:smile:

Кстати, в инете не раз находил информацию о том что в MS SQL 2008R2 Expr. ed. размер базы увеличен с 4Гб до 10Гб, но на сайте микрософта подтверждения не нашел. Если это правда - то тогда это супер.

Строго говоря и 4Гб без хранения файлов и подобного более чем достаточно было бы... правда, там еще ограничения конечно есть в плане процессоров, памяти и т.д, да и про tbl_SystemLog со скриншотами не забываем:) в рамках оффтопика...

"Евгений Либин" написал:Вот есть хорошая статья по организации FileStream
http://blogs.msdn.com/b/alexejs/archive/2009/06/03/filestream.aspx
Основное достоинство этой технологии - это то что объем хранимой информации не влияет на общий объем БД, а следовательно можно пользоваться MS SQL Server 2008 R2 Express Edition бесплатно еще какое-то время, пока база не станет объемом 4 Gb.

спасибо, Евгений :) очень познавательно.

кстати, а как быть с backup? как происходит бэкап данных при использовании filestream?

Hello, colleagues !
This link really helped, thank You :). Have You tested the solution with table tbl_Files? I noticed, that some "instead of" triggers have to be removed to be able to change column FileDate datatype from Image to Varbinary, that use FileStreams. This cause access rights functionality.

Это решение уже кто-то в реальном проекте использовал? Или всё на стадии интереса?

"Евгений Либин" написал:Основной размер писем составляют аттачи. В новой версии почтового клиента аттачи вынесены в tbl_Files. Именно с этой целью.

У нас например за два года работы эта таблица выросла уже до 36гб (лимит Firebird), есть ли наработки по разделению таблицы tbl_Files на несколько? Например с UNION в SELECT запросе и подмене в INSERT`е и насколько это повлияет на производительность?

Здравствуйте!

К сожалению у нас не было опыта в разделении таблицы tbl_Files. Производительность, естественно, незначительно уменьшиться. Для того чтобы получить конкретные данные - необходимо тестирование.

Спасибо Дмитрий, значит будем тестировать...

Добрый день!
Возвращаясь к filestream, можно его все-таки использовать в Террасофте для таблицы файлов или нет?
TS 3.4.1.
SQL 2014
Террасофт умеет работать с данными типа varbinary(max) filestream?

1) включили возможность файстрима на сервере
2)создали файловую группу для базы
3)в качестве проверки функциональности создали новую таблицу через sql, там поле varbinary(max) filestream-засунули туда данные через sql - ну тут все ок
4) добавили в таблицу tbl_Files новое поле FileData1 varbinary(max) filestream; (перед этим пришлось удалить триггер к этой таблице - на instead of delete)
5) Пошли в террасофт администратор, там взяли в таблице tbl_Files, полe FileData сменила на FileData1 (не меняя при этом тип, и не сохраняя в бд потом таблицу (потому как не видим типа varbinary в приложении), пошли в sq_Files - там выбрали FileData1 вместо FileData.
6) Зашла в террасофт, добавили файл, файл даже добавился файловую группу, но террасофт его не может потом прочесть, потому что видимо не подозревает про тип варбинари с признаком файлстрим

Работа с filestream обсуждалась тут и тут. Также тут обсуждают альтернативные реализации с хранением в другой базе.

Показать все комментарии

Как полностью очистить базу MS SQL, оставив ее структуру и данные одного пользователя для входа?
Данный вопрос возник в связи с необходимостью передачи базы специалисту для удаленной работы.

Нравится

9 комментариев

Добрый день!
На данный момент эту задачу разработчики чаще всего решают путем написания SQL-скриптов очистки наполнения. Возможно, участники Community предложат варианты скрипта, но такое задание нетрудно выполнить и самостоятельно. Пример:

delete from tbl_Task
delete from tbl_Document
delete from tbl_Contact where Name <> 'Supervisor'
и т.д. в зависимости от Вашего наполнения.

Справочники очищать и, соответственно, "замусоривать" не рекомендуется, т.к. в системе существуют привязки к некоторым значениям.

Дмитрий,
delete from [tbl_Name] - это я знаю.
А как можно сразу, одним или двумя скриптами, очистить всю базу целиком, а не по одной таблице?
________________________________________
www.abs.com.kz
Агентство недвижимости АБС Royal Estate

Наверняка Вы понимаете под фразой "целиком" удаление лишь ненужного Вам наполнения. При этом подразумевается, что останутся записи в таблицах tbl_Contact (Supervisor), tbl_Account (Ваша компания), tbl_AdminUnit (Supervisor, Все пользователи), таблицы с отчетами, справочниками, лицензиями и т.д., то есть система в том виде, в каком она была на момент старта работы с ней.
Встроенных скриптов или средств очистки пользовательского наполнения, насколько мне известно, система внутри себя не содержит, обычно для этого разработчики сами пишут подходящие скрипты. В Вашем случае, возможно, будет быстрее решить задачу самостоятельно и впоследствии пользоваться полученным скриптом.

Дмитрий, в этом Вы правы.
Но в том то и дело, что самостоятельно решить задачу не могу, поэтому задал вопрос здесь. Нужна помощь.
______________
www.abs.com.kz
Агентство недвижимости АБС Royal Estate

Думаю, единственный вариант - обнулять связи и удалять данные с помощью запросов:

delete from tbl_Contact
where Name <> 'supervisor'
 
delete from tbl_Account
where Name <> 'Ваша компания'

...

Или же...развернуть пустую базу из резервной копии.

Если Вам нужно передать для удаленной работы "с нуля" - то Вы можете отправить дамп из установочного каталога Террасофт.
Но, насколько я понял, у Вас уже сделаны некоторые настройки конфигурации, и Вам надо отдать базу на доработку.
Так как никто из здесь присутствующих не знает, какие конкретно таблицы Вы добавили в рамках собственной настройки (новые справочники, новые разделы и детали), то и советы только общие - напишите скрипты для удаления из всех НЕ справочных таблиц, а также удаляйте из tbl_Contact и tbl_Account так, как написала Татьяна (чтобы осталась возможность подключения к базе. Кстати, возможно что у Вас администратор уже не Supervisor, и компания называется по-другому - это зависит от того, установлены ли лицензии).

Как вариант: в пустую базу перенести все сервисы из доработанной. Будьте внимательны с новыми значениями справочников.

"Татьяна Адамчук" написал:Или же...развернуть пустую базу из резервной копии.

может быть этот вариант лучше будет? подскажите, как это сделать :)
______________
www.abs.com.kz
Агентство недвижимости АБС Royal Estate

Вы можете написать запрос в Службу технической поддержки Terrasoft с просьбой предоставить чистую базу вашего продукта. Также вы можете получить чистый бэкап выполнив административную установку из дистрибутива. Бэкап будет находится в каталоге Terrsoft, в папке DB.

Показать все комментарии

Если нужно быстро узнать каким пользователям какие права доступа установлены к таблице в базе Microsoft SQL, можно воспользоватся запросом:

SELECT dp.NAME AS principal_name,
           dp.type_desc AS principal_type_desc,
           o.NAME AS object_name,
           p.permission_name,
           p.state_desc AS permission_state_desc

   FROM    sys.database_permissions p
   LEFT    OUTER JOIN sys.all_objects o
   ON     p.major_id = o.OBJECT_ID
   INNER   JOIN sys.database_principals dp
   ON     p.grantee_principal_id = dp.principal_id

   WHERE o.NAME = 'tbl_Bank'

Нравится

Поделиться

0 комментариев
Показать все комментарии

Перенос базы данных необходимо выполнять только через действия Backup\Restore, что позволяет не нарушать внутренние связи таблиц, представлений и т.д.
Действие Attaach\Detach не обеспечивает стабильную работу базы при переносе на другой сервер.
При переносе базы данных, версии Terrasoft CRM 3.1 и выше, с одного сервера на другой есть необходимость создавать Имена входа(Login) непосредственно в СУБД для всех пользователей (Для низших версий - данное действие проводиться только для администраторов Terrasoft CRM).
При создании Login нет необходимости указывать какую-либо конкретную базу данных - все значения оставляем "по умолчанию".
Для пользователей, которые имеют административные права в Terrasoft CRM при создании Login, на закладке [Server Roles], необходимо выставить значение [sysadmin].
После создания имени входа обычного пользователя, необходимо сопоставить имя пользователя(User),непосредственно в базе данных, с именем входа(Login)на СУБД.

Нравится

Поделиться

15 комментариев

Если описанный выше перенос происходит для баз данных под MSSQL 2005 может возникнуть ошибка при добавлении полей в таблицы:

Cannot execute as the database principal because the principal "fkeys" does not exist, this type of principal cannot be impersonated, or you do not have permission. «Call Stack»

Помогает следующий скрипт

sp_change_users_login 'update_one', 'fkeys', 'fkeys'

А что это за пользователь fkeys?

"Павел Крышкин" написал:Если описанный выше перенос происходит для баз данных под MSSQL 2005 может возникнуть ошибка при добавлении полей в таблицы:

Cannot execute as the database principal because the principal "fkeys" does not exist, this type of principal cannot be impersonated, or you do not have permission. «Call Stack»

Помогает следующий скрипт


или под MSSQL 2008

1) Удаляем процедуру tsp_fkeys
2) Удаляем пользователя fkeys
3) Делаем BAK базы
4) Востанавлеваем базу из BAK-файла

При первом входе Supervisor-а в систему, автоматически создаются tsp_fkeys и fkeys. Проверено! 100%

"Ковалишин Виталий" написал:

А вот у меня почему-то не сработало на 2008 :(
Как раз не создался login fkeys

"Ковалишин Виталий" написал:При первом входе Supervisor-а в систему, автоматически создаются tsp_fkeys и fkeys

Проверял на 2005 и 2008! Несколько раз!
После востановления - не создается, после первого входа supervisor в систему - создаются...

а все-таки, для чего он нужен?

Данный пользователь является встроенным пользователем MS SQL версии 2005 и выше и используется специально для получения внешних ключей записи, так как у обычного пользователя нет прав на данное действие.
Без получения внешних ключей не получиться удалить некоторые записи или таблицы.

Не удается удалить пользователя fkeys, Management Studio выдает ошибку:
"The database principal is set as the execution context of one or more procedures functions, or event notifications and cannot be dropped"
Подскажите как быть в этом случае.

Данное сообщение означает что удаляемый Вами пользователь используеться для выполнения одной или более функций и не может быть удаленным.
Уточните:
1) Для чего Вы удаляете данного пользователя?
2) Вы пытаетесь удалить пользователя базы данных(User) или имя входа SQL(Login)?

Следую инструкциям Виталия Ковалишина:
1) Удаляем процедуру tsp_fkeys
2) Удаляем пользователя fkeys
3) Делаем BAK базы
4) Востанавлеваем базу из BAK-файла

На втором этапе пытаюсь удалить пользователя fkeys базы даных (User), а он никак :sad:

Андрей, в данном случае проще и быстрее будет выполнить пункты 3) и 4) Виталия, а после этого следовать инструкции Павла:

"Павел Крышкин" написал:Помогает следующий скрипт
sp_change_users_login 'update_one', 'fkeys', 'fkeys'

Пользователь fkeys может использоваться не только в процедуре tsp_fkeys, но и в некоторых других объектах БД, и поиск всех таких объектов для того, чтобы удалить их или убрать связь с fkeys, может занять более продолжительное время, чем выполнение скрипта.

Спасибо Олег, скрипт действительно помог!
Но пришлось создавать имена входа в СУБД для каждого пользователя, как писал изначально Клименко Николай, и затем применять для каждого из них этот скрипт.

Добрый день!
После переноса базы через Backup/Restore, добавления всех пользователей и сопоставления имен имеется следующая проблема:
В базе невозможно удалить старые записи даже пользователем с правами администратора. При попытке удаления выдается следующее сообщение об ошибке:
"Ошибка выполнения метода 'mds_RecordsForDeleteOnDatasetAfterOpen'. Ошибка удаления записи. Оригинальное сообщение: Выполнение данной инструкции было прервано.
Конфликт инструкции DELETE с ограничением REFERENCE "FTaskContactID". Конфликт произошел в базе данных "Terrasoft", таблица "dbo.tbl_Task", column 'ContactID' «Call Stack»"

Используется Terrasoft XRM 3.3.2.43.

Сергей, в данном случае Вы, скорее всего, пытаетесь удалить записи в разделе "Контакты", по которым существуют задачи. Попробуйте открыть деталь "Задачи" для контакта, которого Вы хотите удалить. Если в детали есть записи, надо сначала удалить их, либо очистить в этих задачах поле "Контакт".

Здравствуйте.

Понимаю, что тема старая и может даже не нужная... но вдруг кому-то время сэкономит...

Переношу с MSSQL 2000 базу на 2012 (через 2008).

В 2012-ом (и в 2008 тоже) пользователь "fkeys" не создался и процедура "tsp_fkeys" тоже...

Проблемма в том, что в процедуре tsp_GetLoginInfo строчка "set @version = convert(int, substring(convert(char(20), serverproperty('productversion')),1,1))" выдаёт "1" и соответственно "if (@version > 8) " не отрабатывает.

Меняем на "if (@version > 0) " и всё создаётся и отлично работает!

Спасибо.

Показать все комментарии

У многих, кто впервые сталкивается с MS SQL Express 2005, возникает вопрос: "Как правильно подключить нескольких пользователей к одной базе для совместного использования?"
http://community.terrasoft.ua/forum/topic/2482

Соответственно, я решил описать полный процесс подключения с картинками ;)

И так, приступим!

В стандартной инсталляции MS SQL Express 2005 сетевая служба отключина.
Вам необходимо:

1) Запустить MS SQL Configuration Manager
2) TCP\IP - свойства

3) Включено - "ДА"

4) ТСР порт - 1433

5) Разрешить на Вашем сетевом интерфейсе

6) Сохранить
7) Включить службу TCP\IP - "Включить" (см.рис 01)
8) Перезагрузить MS SQL Express 2005

На клиенте, можно прописать не имя машины, а IP,port
Например: 192.168.1.4,1433

Должно работать!

Нравится

Поделиться

0 комментариев
Показать все комментарии