Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» InterBase и FireBird: вопросы по работе и их решение

Автор: MagistrAnatol
Дата сообщения: 09.10.2008 10:47
LeaF_AVF
понятно,ето мне в каждом цыкле надо генерить евент,приостанавливаеться работа процедури - я на клиенте считываю евент,и продолжаю цыкл на серваке.Весело.
Ето в лутшем случае увеличит время выполнения процедуры вдвое,плюс приколы с нагруженостью сетки еще замедлить время выполнения.
Нда абыдно.
Кта,а в природе ваще существует сервак на котором моно реализовать мою задачу без заморочек?
Автор: LeaF_AVF
Дата сообщения: 09.10.2008 10:51
MagistrAnatol

Цитата:
приостанавливаеться работа процедури

нет, процедура не будет останавливаться, она будет генерить эвенты, которые будет регистрировать компонент в твоем приложении.

Может ты опишешь, что именно ты хочешь сделать и кто-то подскажет тебе другой путь решения проблемы (возможно, что и я ?
Автор: MagistrAnatol
Дата сообщения: 09.10.2008 11:15
Вот моя процедура,немного покоцанная
SET TERM ^ ;

CREATE OR ALTER PROCEDURE NACHICLENIE (
kvartal integer,
god integer)
returns (
kolvo integer)
as
declare variable
....
begin

kolvo=1;
for select a.NAME Grupa_Name,a.kod_grypu,(select first 1 proc from proc_grypu where (a.grupa_master_id=grupa_master_id) and (data<:DATA_PROVEDENNYA) order by data desc) ,b.NAME Obekt_Name,b.DATA_VVODA,b.PERV_CTOIM,b.CROK_AMORT,b.NARAHOVANO,b.OCTATOCHNA_CTOIM,b.STATUS,b.CTAN_AMORT_MASTER_ID from grupa a left join ctan_amort b
on a.grupa_master_id=b.grupa_master_id
where (b.name is not null) and (b.OCTATOCHNA_CTOIM<>0) and (data_vvoda<:DATA_PROVEDENNYA) and (not data in (select data from dvig_amort where data=:data_provedennya and b.CTAN_AMORT_MASTER_ID=CTAN_AMORT_MASTER_ID))
into :Grupa_Name,:kod_grypu,:proc,:Obekt_Name,:DATA_VVODA,:PERV_CTOIM,:CROK_AMORT,:NARAHOVANO,:OCTATOCHNA_CTOIM,:STATUS,:CTAN_AMORT_MASTER_ID do begin
.....
insert into ....
suspend;
kolvo=kolvo+1;
Я хочу на клиенте увидеть измининие kolvo - сделать прогресс бар
end
end
Автор: LeaF_AVF
Дата сообщения: 09.10.2008 11:28
MagistrAnatol
эта процедура должна выполняться очень долго?

как вариант - записывать значение параметра kolvo в какую-то таблицу и периодически (по таймеру к примеру) считывать значение и преобразовывать в значение прогресс-бара?
Автор: MagistrAnatol
Дата сообщения: 09.10.2008 11:52
Наскоко долго я не знаю,зависит от кол-ва записей.Скорое всего записей до 1000
Вполне возможно что я не успею отследить

Цитата:
как вариант - записывать значение параметра kolvo в какую-то таблицу и периодически (по таймеру к примеру) считывать значение и преобразовывать в значение прогресс-бара?
- я уже писал об етом в своем первом посте.
Такой вариант имеет тоже свои недостатки - клиент будет постоянно дергать сервер,
шо ни есть хорошо
Автор: LeaF_AVF
Дата сообщения: 09.10.2008 11:59
MagistrAnatol
тогда (если уж совсем невтерпеж и не обойтись без прогресс-бара) - генерируй эвент не после каждой записи, а к примеру после каждой пятидесятой-сотой...

з.ы. хотя лично я бы просто курсор поменял на crSQLWait (это если в Delphi) а потом вернул в обычный.. Достаточно и такой индикации
Автор: MagistrAnatol
Дата сообщения: 09.10.2008 12:06
Моно и курсор поменять , просто хотелось нагляднее сделать
Автор: LeaF_AVF
Дата сообщения: 09.10.2008 12:23
MagistrAnatol
можно. но не в ущерб производительности, ИМХО
Автор: MagistrAnatol
Дата сообщения: 09.10.2008 13:03
И еще такой вопрос - у меня доступ к таблицам - процедурам розграничивается на уровне ролей.Кому какая роль я задаю при создании нового юзера.
На до ли явно при конекте указывать роль,ведь я наперед не знаю кому что,
ето придеться два раза открывать базу- раз шоб открыть , второй определяю роль и по новой конектю юзера но уже с ролью?
Автор: LeaF_AVF
Дата сообщения: 09.10.2008 13:11
MagistrAnatol
зачем дважды?
сразу коннектись с нужной ролью
Автор: MagistrAnatol
Дата сообщения: 09.10.2008 13:23
Но ведь я не знаю априори какая роль дана какому юзеру.
И в роли у меня прописано какую табличку и как юзать.И юзер привязан к етой роли -
так зачем мне ее указывать при конекте???
Автор: LeaF_AVF
Дата сообщения: 09.10.2008 13:32
MagistrAnatol
как это не знаешь?
роль - это права пользователя
ты не знаешь какие права у Васи Пупкина - администратора или менеджера???

з.ы. один и тот же юзер при коннекте указывая различные роли - получит соответственно и разные права.
Т.е. по идее ты можешь создать одного пользователя для всех, а роли - разные!
И нормально будет работать разграничение доступа
Автор: MagistrAnatol
Дата сообщения: 09.10.2008 14:11
LeaF_AVF
Ну админские права токо у меня ,хотя не об етом речь
Юзеров может заводить токо админ?
А теперь смотри - я то знаю какие роли я кому раздам,хотя могу и забыть, а откуда моя программа будет знаю какая роль у какого юзера? или под какой ролью заходить если юзер один и вагон ролей?В данной ситуации мне наперед надо знать и юзеров и роли, а
юзеры ваще храняться на серваке а роли в базе.Тоеть без двойного открытия ты не обойдешся.Если у тебя два юзера то нормально,а если с полсотни???

Цитата:
Т.е. по идее ты можешь создать одного пользователя для всех, а роли - разные!
И нормально будет работать разграничение доступа

С етим не согласен - работать то будет - но с точки зрения безопасности ето не верно,
хотя сервера приложений в большинстве случаев так и реализуються.
Или я не так объясняю или мы говорим о разных вещах.
У меня есть к примеру одна табличка и 2 роли :
1я роль - один селект конкретной таблички
2я роль - селект+инс/апд
Я создаю нового юзера и привязываю его к роли на уровне сервера - меня интересует
надо ли в данной ситуации при конекте клиента явно указывать роль или нет??
Я догнал о чем ты говориш
Цитата:
администратора или менеджера???
-
в такой реализации немного усложняется структура базы - ты создаеш табличку
с юзерами и их так сказать правами - администратор - полный доступ,менеджер - к примеру токо просмотр и тд. На уровне сервера разграничиваеш доступ администратор одни права,менеджер другие и тд.Конектишся под, к примеру, сисдба а потом уже
конектиш конкретного юзера - я правильно понял?Но опять же, тебе сначала надо приконектится к серверу,открыть табличку пользователей - найти юзера,который пытаеться войти,прочитать его роль(админ.,менеджер),отконектится от сервера,-
и конектится уже с ролью. Моно конечно реализовать проще - держать базу юзеров гдето в реестре или инишке,но ето не прикольно.
Но честно говоря лень нагромождать базу,и ето немного больше геморно


Автор: sergiuz1303
Дата сообщения: 09.10.2008 14:28
MagistrAnatol
Я вижу два варианта решения твоей проблемы:
1. Если пользователи и права записаны в какую нить табличку на базе тогда ты конектишся под SYSDBA а права обрабатываешь програмно, этот может делать только селект а этот еще и инсерт просто считываешь его права в переменную и исходя из нее открываешь дополнительные опции согласно прав.
2. Если пользователи у тебя забиты в USERS то тут проще простого ты прям на сервере создал роли и права а сервер сам разбереться что те нужно делать. В таком случае клиенсткая тачка конектится не под SYSDBA а под USER1
Автор: MagistrAnatol
Дата сообщения: 09.10.2008 14:31
Короче я уже методом втыка разобрался - в моей ситуации не надо явно указывать роль
И еще такой ньюанс -
я инталирую файребирд с нормальным способом - с инсталятора - в командной втроке задаю
Firebird-2.5.0.20343_0_Win32.exe /DIR=%1 /COMPONENTS="ServerComponent\SuperServerComponent,ServerComponent,DevAdminComponent,ClientComponent" /TASKS="UseGuardianTask,UseServiceTask,AutoStartTask,CopyFbClientToSysTask,CopyFbClientAsGds32Task" /SILENT
а у меня ставиться класический сервер и не копируется gds32.dll - ето я чет не так задал или ето глюки инталятора?

Добавлено:
sergiuz1303
у меня и реализовано по 2 варианте и все нормально,я токо хотел узнать надоли задавать роль при конекте - уже разобрался не надо,сервак сам фиг пустит если у тебя нет нужной роли
Автор: LeaF_AVF
Дата сообщения: 09.10.2008 15:04
MagistrAnatol
переубеждать тебя не буду
вот цитата с ibase.ru

Цитата:

Как работает аутентификация Windows в Firebird 2.1?
Для начала следует вспомнить несколько простых правил:

пользователи БД находятся в security2.fdb
роли находятся в конкретной базе данных
права пользователя (grant, revoke) выдаются пользователю в конкретной базе данных
чтобы пользоваться правами роли, пользователь должен а) быть включен в роль, б) указать роль при логине к БД


Пойми, роль, это такой же параметр при коннекте как и имя пользователя, и пароль!
Если ты пользуешься FIB'ами, загляни в свойство TpFIBDatabase.ConnectParams

P.S. Имхо ты создаешь проблемы, там где их нет

Добавлено:
MagistrAnatol
еще тут статья полезная по ролям, хоть немного и старовата..
Автор: MagistrAnatol
Дата сообщения: 09.10.2008 15:45
LeaF_AVF
спорить не буду,я просто конектился без указания роли и если у юзера в роле не указан селект на какую-то тамблицу - его просто не пускает,проверено на практике,хотя может быть ето и не верно.
А поводу моего предыдущего поста по инсталятору?
Автор: LeaF_AVF
Дата сообщения: 09.10.2008 15:48
MagistrAnatol
по инсталлятору не скажу - я ставлю новые версии сервера редко и предпочитаю это делать руками
Автор: MagistrAnatol
Дата сообщения: 09.10.2008 16:01
Понятно.
Кста,тут пробывал версию 2,5 - пока лажа - толи фибсы еще не перестроились толи сервак глючит
Автор: LeaF_AVF
Дата сообщения: 09.10.2008 16:06
MagistrAnatol
ты пишешь приложение для промышленного использования?
Автор: sergiuz1303
Дата сообщения: 09.10.2008 17:21
LeaF_AVF
Я дико извиняюсь за флуд но а что есть разница в приложении для промышленого или не промышщленого использования;)

MagistrAnatol и всем остальным
А меня интересует такой вопрос: Когда я добавлял пользователей и менял пароль для SYSDBA то у меня это происходило для всего сервера. А значит и для всех БД которых я насоздавал. Так вот есть у меня одна проблема в жизни я всегда изменял пароль для SYSDBA на свой и проэкты написанные другими програмистами у меня тогда не запускаються как избавиться от проблемы изменения пароля для всех баз.
Автор: OXDBA
Дата сообщения: 09.10.2008 17:43
sergiuz1303
Во избежание несчастных случаев на производстве, владельцем БД должен быть не SYSDBA.
Автор: sergiuz1303
Дата сообщения: 10.10.2008 00:29
OXDBA
Хе это и ежу понятно трабл в том что как его у брать не навредив всей системе СУБД фаербирд
Автор: AngeL
Дата сообщения: 10.10.2008 06:30
у нас пром. преприятие, но юзверь SYSDBA и ничего страшного! Зачем вобще юзверя менять то? у нас правда версия еще 1.5, но база огромная и все вроде неплохо, работаем!
Автор: LeaF_AVF
Дата сообщения: 10.10.2008 09:07
sergiuz1303
разница в том, что для промышленного использования Firebird 2.5 (который находится в стадии альфа-тестирования) я бы не стал.

по поводу пароля для SYSDBA - все пользователи хранятся в отдельной БД (в зависимости от версии сервера менялось их название - ISC4.gdb, security.fdb)
если в программе у тебя жестко прописан пароль, который ты установил, то нужно или изменить пароль для SYSDBA на той машине где он не запускается или (что предпочтительнее, ИМХО) - переписать код

AngeL
плохо то, что в этом случае невозможно БД сделать Shutdown (если есть активные пользователи SYSDBA)
Автор: OXDBA
Дата сообщения: 10.10.2008 10:13
sergiuz1303
Сбросить метаданные в скрипт, создать БД под нужным пользователем, перелить данные каким-нибудь datapump'ом. Сделать этот один раз и забыть о проблеме совместной жизни на одном сервере с чужим софтом. Да кстати, опять же учитывая опыт разработки тиражируемых приложений, клиентские приложения должны использовать fbclient.dll, а не gds32. Поможет мирно сосуществовать с IB.
AngeL

Цитата:
база огромная и все вроде неплохо

FB очень терпелив
Кстати, нескромный вопрос огромная это сколько? Просто в полуторке мне помнится ограничение было, что-то около 36 гигов на таблицу.

Добавлено:
LeaF_AVF
Дык это же промышленное предприятие, клиенты конце рабочего сами из базы разбегаются
Автор: LeaF_AVF
Дата сообщения: 10.10.2008 11:04
OXDBA
про промышленное предприятие я говорил в контексте использования Firebird 2.5 alpha
Автор: OXDBA
Дата сообщения: 10.10.2008 11:46
LeaF_AVF
Да я не об этом, AngeL пишет что у них пром. преприятие, ты абсолютно правильно отмечаешь проблему шатдауна, когда все вокруг SYSDBA, вот я и отшутился, что проблемы отстрела пользователей от базы у них нет, ибо те сами разбегаются в конце рабочего дня
Автор: LeaF_AVF
Дата сообщения: 10.10.2008 12:00
OXDBA
сорри, к пятнице чувство юмора кажется, приблизилось к нулю
Автор: and23
Дата сообщения: 10.10.2008 15:37
2MagistrAnatol: Про способы получения прогресса ХП Вам давно и исчерпывающе отвечали в "Вопросах по компонентам": http://forum.ru-board.com/misc.cgi?action=printtopic&forum=33&topic=8529 . Читали?

2delover: Я имею в виду конструкцию типа
Код: SELECT
t1.f as f1, t2.f as f2
FROM table1 t1
LEFT JOIN table2 t2 ON
(t1.num = t2.num)
UNION
T3.f as f1, :default_f2 AS F2
FROM table1 T3
WHERE <Ваше ELSE-condition>

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465

Предыдущая тема: Сравнение двух строк


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.