Структура базы Лоцман:PLM

Автор Stich, 02.04.13, 08:00:05

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Stich

02.04.13, 08:00:05 Последнее редактирование: 02.04.13, 08:30:13 от Stich
Здравствуйте, коллеги. Подскажите пожалуйста, никак не могу разобраться.
В базе лоцмана есть таблицы:
rvwAttributes - "содержит атрибуты объектов, сущ-е в базе данных и доступные текущему пользователю" (из документации),
а есть таблица vwAttributes. Вопрос состоит в том, что она содержит в себе (чем отличается от предыдущей?) и что означает в ней поле "Идентификатор правила"? Что имеется ввиду за правило?  Не могу найти информацию по этой таблице.
И как правильно получить значение атрибута, идентификатор которого я знаю, в смысле из какой таблицы мне его (значение) брать?
Еще есть таблица Dbo.vwAttrValues. Какую из этих трех таблиц мне использовать для получения значения атрибутов объекта?

Manuylov

насколько я понимаю, то документированы только представления/вьюхи rvw..., остальное - это внутренние объекты Лоцман и использовать их не рекомендуется.

Chaa

Как уже сказали выше, лучше использовать документированную rvwAttributes.

vwAttributes скорее всего то же самое, что rvwAttributes, но с большими возможностями (возвращает значения атрибутов с типом текст и изображение).

vwAttributes и vwAttrValues очень похожи, но для vwAttrValues определен триггер, который может обрабатывать изменение представления.

Stich

Столкнулся со следующей проблемой.
Мне было поручено создать в базе Лоцмана новую таблицу и в нее добавлять некую выборку из этой же базы ежедневно.
Процедуру на TSQL я написал. Она работает исправно. Все отлично. Процедура состоит просто из
INSERT
      Вложенный SELECT

Потом я попытался поставить этот процесс на автоматизацию: создать в SQL agent задание и поставить на ежедневное выполнение.
В задании просто пишу:
use [****]
exec dbo.(моя процедура)
Запускаю задание на выполнение и... не выполняется. Пишет что пытается вставить значение NULL (ну и соответственно не может, потому что я запретил NULL в таблице). Я долго не мог понять в чем проблема, всячески пытался давать права юзеру, который выполняет работу. В итоге открыл для себя интересную вещь. Процедура действительно возвращала NULL, потому что по неведомой мне причине стандартные вьюшки Лоцмана (dbo.rwv*****) Не видны SQL Agent'у.
Я пробовал создавать два типа заданий для агента:
Сделать просто выборку из таблицы
Сделать просто выборку из вьюшки
Для таблицы значения возвращаются нормально. Для вьюшки возвращает NULL'ы. Подскажите пожалуйста, в чем проблема? Почему SQL агент делает пустые запросы из вьюшек? Хотя сама процедура работает исправно.
---------
UPDATE
Создал вьюшку собственную, забил несколько параметров туда. Для нее работа выполняется тоже исправно. На всех остальных вьюшках стоит значок замочка. Что он означает? Это Лоцмановские стандартные вьюхи? Может в этом дело?
----------
UPDATE
Узнал, что этот значок означает, что вьюха создана с шифрованием. В таком случае я подозреваю, что у меня так и не получится взять из нее данные агентом (хотя тогда не понятно, почему процедура все же работает). Как же тогда быть?

Manuylov

в процедурах очетов используется вызов метода пакета (у меня оракл)
dt_id.prsetcurrentuser;

видимо Вам тоже надо это сделать

можно посмотреть как в MS SQL вызывается, посмотрев процедуры отчетов, например rep_TasksForActorsDone

вьюхи вида rwv* имеют проверку прав доступа к объектам Лоцман по пользователям Лоцман.
+ Благодарностей: 1

Stich

Цитата: Manuylov от 05.04.13, 09:42:07
вьюхи вида rwv* имеют проверку прав доступа к объектам Лоцман по пользователям Лоцман.
Спасибо огромное!! Вы просто пролили свет на сегодняшнее пасмурное утро! Все дело в том, что пользователь, запускавший службу SQL Агента (и соответственно он же выполнял процедуру) не был администратором в лоцмане. После того, как я добавил его в качестве админа, то и вьюшки он сразу стал видеть.
Кстати, небольшой оффтопик: как цитировать сообщения на форуме, написанные предыдущим пользователем? Я почему то могу его процитировать только после того, как кто-то еще напишет сообщение после него:)

Stich

А вот еще вопрос, практически очевидный, но я все же хотел бы знать точно.
Скажите, пожалуйста, запросы для модулей лоцмана лучше делать стандартными API функциями, или же лучше соединяться с базой напрямую и использовать sql запросы? По сложности они для меня практически эквивалентны. По скорости, я так думаю, что SQL-запросы выигрывают. А вот какие подводные камни бывают, если использовать sql-зарпосы?

Chaa

У сервера приложений есть метод GetReport, который позволяет выполнить хранимую процедуру на сервере и получить набор данных.
+ Благодарностей: 2

Stich

Дело в том, что у меня есть просто запрос TSQL, это не хранимая процедура. Поэтому и спрашиваю.

Manuylov

все зависит от решаемой задачи и метода решения

Цитата: Stich от 05.04.13, 09:23:46
....
Процедуру на TSQL я написал.
....

а как же это?

Chaa

Цитата: Stich от 05.04.13, 14:47:07
Дело в том, что у меня есть просто запрос TSQL, это не хранимая процедура. Поэтому и спрашиваю.
Нет никакой разницы, напишите запрос внутри хранимой процедуры, его результаты вернет GetReport в виде датасета.
Если нужно передавать параметры, то их нужно в приложении перед вызовом GetReport собрать в строку, а в хранимой процедуре разобрать.

Prog2

Цитата: Stich от 05.04.13, 12:02:37
А вот еще вопрос, практически очевидный, но я все же хотел бы знать точно.
Скажите, пожалуйста, запросы для модулей лоцмана лучше делать стандартными API функциями, или же лучше соединяться с базой напрямую и использовать sql запросы? По сложности они для меня практически эквивалентны. По скорости, я так думаю, что SQL-запросы выигрывают. А вот какие подводные камни бывают, если использовать sql-зарпосы?
Прямыe SQL-запросы отрабатывают быстрее, чем запросы через сервер приложений, проверено. Подводных камней при чтении нет, разве что надо разбираться в структуре БД.
При записи можно наделать ошибок: чекауты, ограничения и т.д., поэтому либо быть очень внимательным, либо использовать API.

nnspu

Цитата: Chaa от 02.04.13, 14:32:02
Как уже сказали выше, лучше использовать документированную rvwAttributes.

vwAttributes скорее всего то же самое, что rvwAttributes, но с большими возможностями (возвращает значения атрибутов с типом текст и изображение).

vwAttributes и vwAttrValues очень похожи, но для vwAttrValues определен триггер, который может обрабатывать изменение представления.
Разница между представлениями vwAttributes и vwAttrValues только в том, что vwAttributes выводит атрибуты все, за исключением вновь добавленных в еще несохраненных рабочих проектах, тогда как vwAttrValues выводит вообще все атрибуты.