Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: как отловить таймауты

пользователи жалуются на таймауты
на стороне приложения логировать чего-либо нет возможности
подскажите как собрать статистику по таймаутам средствами sql server?

Пока думаю с помощью xevents собирать события начала и окончания выполнения запросов, если окончания нет - значит таймаут
но это как-то слишком много данных придется обрабатывать

может есть способ проще?
Ответ: Я так понимаю, если пользователи жалуются на таймауты, то клиент принудительно останавливает выполнение запроса по таймауту, а это логировать довольно просто: трасса события rpc:completed и SQL:BatchStarting фильтр по полю Error код ошибки 2 (или 1, не помню). Вот и получите таймауты
Вопрос: Запрос об удачных и неудачных попытках подключения к базе данных

Помогите написать запрос.

В таблицу записана информация, об удачных и
неудачных попытках подключения к базе данных (Пользователь,
Время, Удачно\Неудачно). Требуется получить список
пользователей, которые совершили подряд три неудачные
попытки подключения наряду с зафиксированным временем
третьей неудачной попытки. После трех подряд неудачных
попыток отсчет попыток начинается сначала.

Например, для таблицы:

Пользователь Время Статус
A 20.11.11 17:58:00 Неудачно
B 20.11.11 18:00:05 Удачно
C 20.11.11 18:10:03 Неудачно
A 20.11.11 18:12:20 Неудачно
B 20.11.11 18:18:00 Неудачно
B 20.11.11 18:20:01 Удачно
C 20.11.11 18:25:42 Неудачно
A 20.11.11 18:30:12 Неудачно
A 20.11.11 18:32:24 Неудачно
A 20.11.11 18:35:00 Удачно
B 20.11.11 18:41:30 Удачно
C 20.11.11 18:42:08 Неудачно
C 20.11.11 18:48:00 Удачно
A 20.11.11 18:52:00 Неудачно
A 20.11.11 18:53:13 Неудачно
B 20.11.11 18:54:30 Неудачно
A 20.11.11 18:55:19 Неудачно
A 20.11.11 18:55:58 Удачно

Результат должен быть такой:

Пользователь Время
A 20.11.11 18:30:12
C 20.11.11 18:42:08
A 20.11.11 18:55:19
Ответ: Сперва создаем таблицу.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE TABLE test AS 
SELECT * FROM (
  SELECT 'A' username, to_date('20.11.11 17:58:00', 'dd.mm.yy HH24:mi:ss') date_add, 'Неудачно' STATUS FROM dual UNION ALL
  SELECT 'B', to_date('20.11.11 18:00:05', 'dd.mm.yy HH24:mi:ss'), 'Удачно'   FROM dual UNION ALL
  SELECT 'C', to_date('20.11.11 18:10:03', 'dd.mm.yy HH24:mi:ss'), 'Неудачно' FROM dual UNION ALL
  SELECT 'A', to_date('20.11.11 18:12:20', 'dd.mm.yy HH24:mi:ss'), 'Неудачно' FROM dual UNION ALL
  SELECT 'B', to_date('20.11.11 18:18:00', 'dd.mm.yy HH24:mi:ss'), 'Неудачно' FROM dual UNION ALL
  SELECT 'B', to_date('20.11.11 18:20:01', 'dd.mm.yy HH24:mi:ss'), 'Удачно'   FROM dual UNION ALL
  SELECT 'C', to_date('20.11.11 18:25:42', 'dd.mm.yy HH24:mi:ss'), 'Неудачно' FROM dual UNION ALL
  SELECT 'A', to_date('20.11.11 18:30:12', 'dd.mm.yy HH24:mi:ss'), 'Неудачно' FROM dual UNION ALL
  SELECT 'A', to_date('20.11.11 18:32:24', 'dd.mm.yy HH24:mi:ss'), 'Неудачно' FROM dual UNION ALL
  SELECT 'A', to_date('20.11.11 18:35:00', 'dd.mm.yy HH24:mi:ss'), 'Удачно'   FROM dual UNION ALL
  SELECT 'B', to_date('20.11.11 18:41:30', 'dd.mm.yy HH24:mi:ss'), 'Удачно'   FROM dual UNION ALL
  SELECT 'C', to_date('20.11.11 18:42:08', 'dd.mm.yy HH24:mi:ss'), 'Неудачно' FROM dual UNION ALL
  SELECT 'C', to_date('20.11.11 18:48:00', 'dd.mm.yy HH24:mi:ss'), 'Удачно'   FROM dual UNION ALL
  SELECT 'A', to_date('20.11.11 18:52:00', 'dd.mm.yy HH24:mi:ss'), 'Неудачно' FROM dual UNION ALL
  SELECT 'A', to_date('20.11.11 18:53:13', 'dd.mm.yy HH24:mi:ss'), 'Неудачно' FROM dual UNION ALL
  SELECT 'B', to_date('20.11.11 18:54:30', 'dd.mm.yy HH24:mi:ss'), 'Неудачно' FROM dual UNION ALL
  SELECT 'A', to_date('20.11.11 18:55:19', 'dd.mm.yy HH24:mi:ss'), 'Неудачно' FROM dual UNION ALL
  SELECT 'A', to_date('20.11.11 18:55:58', 'dd.mm.yy HH24:mi:ss'), 'Удачно'   FROM dual
);
Если очень хочется, можно создать таблицу первым запросом из UNION ALL и сделать 17 INSERT INTO test остальными запросами.
Потом берем запрос KuKu, поскольку я считаю, что он более удачный. Я его только чуть-чуть адаптирую к моим именам полей, поскольку их использовал в CREATE TABLE.

SQL
1
2
3
4
5
6
7
8
9
10
SELECT username, date_add, STATUS FROM ( 
SELECT username, date_add, STATUS, grp,
         ROW_NUMBER() OVER(partition BY username, grp ORDER BY date_add) rn 
FROM (
SELECT username, date_add, STATUS, 
         SUM(CASE STATUS WHEN 'Неудачно' THEN 0 ELSE 1 END) OVER(partition BY username  ORDER BY date_add) grp 
FROM test 
) WHERE STATUS = 'Неудачно' 
) WHERE MOD(rn, 3) = 0 
ORDER BY date_add
Идея запроса в том, что записи для каждого пользователя разбиваются на группы удачными попытками подключения. Соответственно, в каждой группе подряд идут неудачные попытки (если они есть). В запросе выводится каждая третья неудачная попытка подключения. Основным плюсом данного запроса является то, что его можно переделать, например, на четыре неудачных подключения подряд легким движением руки (3 заменяем на 4). С моим запросом такой номер не пройдет, его надо переписывать целиком.

Добавлено через 2 часа 3 минуты
Если не использовать аналитические функции, то я вижу только процедурное решение задачи. Длинное и занудное. Ну и нужна какая-то таблица, в которую будут выводиться результаты, а возможно и две таблицы: одна для результатов, другая для промежуточных вычислений. Либо придется использовать коллекции, которые вы тоже еще, скорее всего, не проходили.

Добавлено через 17 часов 46 минут
Все-таки написал селект, который не использует аналитические функции. Зато происходит пять сканирований таблицы test. Идея та же. Сперва делим на группы удачными попытками, потом в каждой группе иммитируем порядковый номер. Выбираем каждый третий номер из группы, если он есть
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
SELECT username, date_add 
FROM (
SELECT aa.username, bb.date_add, aa.grp,
       COUNT(*) nn
FROM (  SELECT username, grp, MIN(date_add) date_min, MAX(date_add) date_max
        FROM (
        SELECT a.username, MAX(a.date_add) date_add, 
               COUNT(CASE WHEN a.STATUS ='Неудачно' THEN NULL ELSE a.STATUS END ) grp
        FROM test a,
             test b
        WHERE a.date_add <= b.date_add
          AND a.username=b.username 
        GROUP BY a.username, b.date_add
        ) GROUP BY username, grp
     ) aa,
     test bb,
     test cc
WHERE aa.username = bb.username
  AND bb.date_add BETWEEN  aa.date_min AND aa.date_max
  AND bb.STATUS='Неудачно'
  AND cc.STATUS='Неудачно'
  AND cc.username = bb.username
  AND cc.date_add BETWEEN aa.date_min AND bb.date_add
GROUP BY aa.username, bb.date_add, aa.grp
) WHERE MOD(nn,3)=0
ORDER BY 2,1;
Добавлено через 2 минуты
Чуть-чуть подкорректировал селект в сторону упрощения, вроде и так работает, только теперь осталось четыре сканирования таблицы test
Добавлено через 11 минут
Честно говоря, написать селекты с аналитическими функциями было гораздо легче. Ваш препод, скорее всего, спокойно бы отнесся к исходному селекту, а вот последний вызовет у него подозрения, поскольку так никто не делает. Надо иметь некоторый опыт, чтобы это придумать, и надо иметь в голове план, который почти невозможно построить на первых этапах обучения
Добавлено через 1 час 32 минуты
Подправил мелкие ошибки
Добавлено через 11 минут
Вопрос: Рвется соединение с сервером, таймаут 15 минут, как сократить?

Привет,

Ситуевина следующая, есть приложение на линуксах, соединяется через оракловый клиент с 11 сервером.
При разрыве соединения без RST пакетов приложение думает что соединение все еще есть, а по факту его уже нет и это длится примерно 15 минут! Куда копать чтобы сократить этот таймаут?
Приложение? (разработка говорит что это не к ним вообще)
Клиент Oracle?
Сервер Oracle?
Linux сервер Oracle?
Linux клиент Oracle?

Нарыл какие то настройки keepalive на Linux:
tcp_keepalive_intvl = 75
tcp_keepalive_time = 7200
tcp_keepalive_probes = 9

Но выглядит странно... Ощущение что это настройки именно ораклового клиента, но вот где их искать?
Ответ: Например:
- tcp_keepalive_time = 120 (2 минуты)
- sqlnet.expire_time = 2 (минуты)
- поменять таймаут на firewall на неактивное соединение

и так далее
Вопрос: OBIEE. Меры с повторными покупками

Есть факт покупок товаров с возможным участием в промо-акциях.
F$PRD_RECORDS
OPER_IDидентификатор покупки
CLIENT_IDссылка на измерение "Клиент"
TRADE_ORG_IDссылка на измерение "Место совершения покупки"
PRODUCT_IDссылка на измерение "Товар"
PROMO_IDссылка на измерение "Промо-акция"
OPER_SUMполная сумма покупки
PRODUCT_SUMсумма оплаты за товар
PROMO_DISCOUNTпредоставленная по акции скидка на товар
прочие атрибуты и меры


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

Например, имеем такой чек.
  • Молоко - 40 руб.
    Предоставлены скидки по акциям
    Акция "10% на молоко и фрукты" = 4 руб.

  • Хлеб - 30 руб.
    Предоставлены скидки по акциям
    Акций нет.

  • Яблоки - 80 руб.
    Предоставлены скидки по акциям
    Акция "10% на молоко и фрукты" = 8 руб.
    Акция "5% с каждого третьего товара в чеке" = 4 руб.


    Итого.
  • Сумма чека = 150 руб.
  • Сумма скидок = 16 руб.

    В факте это разложится следующим образом (для наглядности вместо ID я указал наименования в некоторых полях).
    OPER_IDCLIENT_IDTRADE_ORG_IDPRODUCT_IDPROMO_IDOPER_SUMPRODUCT_SUMPROMO_DISCOUNT
    987248369Молоко10% на молоко и фрукты150404
    987248369ХлебНет акции150300
    987248369Яблоки10% на молоко и фрукты150808
    987248369Яблоки5% с каждого третьего товара в чеке150804


    Как видно, некоторые меры у нас в факте не аддитивны (значения задублированы), поэтому для их рассчёта в BI мы используем контекстную агрегацию с промежуточной группировкой.

    Например, вот так считается мера "Сумма оплаты за товар".



    Сейчас же появилась задача реализовать более хитрые меры на уровне репозитория.
  • Количество повторных покупок (по сути, это количество покупок минус один по одному клиенту, товару, магазину)
  • Сумма чеков повторных покупок (по сути, это сумма чеков минус чек первой покупки по одному клиенту, товару, магазину)

    Повторная покупка товара - это покупка товара, совершенная одним клиентов, в одном магазине, более 1 раза за указанный в фильтре период.

    Более или менее понятно, как это сделать в Analytics (с применением сводных таблиц). Но наши бизнесовые пользователи хотят эти меры отдельными колоночками, чтобы сразу использовать их в отчётах.

    Не могу придумать, как реализовать вторую меру. Прошу помощи у местных профи. :)
  • Ответ: PranT,

    Чтобы уяснить картину:
    1) Клиент купил в одном чеке две бутылки виски "Джек Дениелс"; вторая бутылка - это повторная покупка? Или все-таки повторной считается покупка тем же клиентом там же того же товара другим чеком?
    2) Чек повторной покупки - это чек, содержащий повторную покупку товара, верно? Если в чеке несколько позиция являются повторными покупками ранних чеков, то нам плевать; главное, что чек уже повторный, верно?
    Вопрос: Повторный запуск ADP

    Всем проходящим добрый день!

    Подскажите кто, что знает...
    Ситуация такая есть проект adp если программу свернуть она прячется в трей к часа, задумка такая дать возможность восстановить окно программы из трея и при повторном запуске, но при повторном запуске проекта программа открывается но у её исчезает лента инструментов, а она нужна. может кто сталкивался подскажите в чем причина почему повторный запуск ADP удаляет панель инстурментов

    К сообщению приложен файл (SysTray.zip - 13Kb)
    Ответ:
    Akina
    Garfish
    при повторном запуске проекта программа открывается но у её исчезает лента инструментов

    Блокированный ресурс.

    Garfish
    при повторном запуске

    Исключите повторный запуск. Вместо него активируйте работающий экземпляр.

    спасибо, так и решили сделать, через поиск приложения на winapi, и отправкой команды развернуть окно
    Вопрос: Возможен таймаут сервера - как его избежать

    День добрый!
    Есть сервис отчетности. Он оперирует таблицами отчетности. Потребовалось создать механизм расчета и контроля значений таблиц по формулам. Я сделал хранимую процедуру. В общих чертах ее принцип работы такой:
    1) Получить список формул таблицы одной очереди исполнения
    2) Подготовить данные для проведения расчетов
    3) Выполнить расчеты
    4) Получить идентификатор следующей очереди исполнения и перейти к п.1
    Код выкладывать не буду, ибо 40 листов формата А4 вряд ли кто-то будет читать.
    Переход к следующей очереди исполнения осуществляю через GOTO поскольку велик риск преодолеть (что, собственно, сразу же и случилось) предел вложенности вызовов функций.
    Пока с таблицей формул связано мало, проблем нет. Но, если формул становится много, подготовка данных для расчетов занимает существенное время. И появляется риск получить таймаут от сервера.
    Можно увеличить время таймаута, но это не панацея. Риск всё равно остается.
    В JS есть интересная особенность. Иногда нужно выполнить какие-то действия в цикле или в ряде вызываемых друг из друга функций. В этом случае, если количество инструкций переваливает за 5 млн., IE начнет распинаться перед пользователем о зависшем скрипте. Но, если исполнение всего этого массива инструкций разбить на вызовы отдельных функций через setTimeout(), то проблема пропадает - при каждом вызове setTimeout() IE начинает подсчет количества инструкций заново. Остальные браузеры определяют зависший скрипт (по сути таймаут) через 30 сек. и мне пока не доводилось так их нагрузить. Но не исключаю, что и здесь можно таким же образом избежать проблемы.
    Так вот хотелось бы знать, можно ли в MS SQL сотворить нечто подобное, или все же таймаут считается от поступления запроса до момента ответа и никак мою проблему разумными средствами не решить?
    Ответ:
    a_voronin
    чтобы не писать в каждом запросе

    SET LOCK_TIMEOUT timeout_period
    

    SET-ы вообще-то действуют на текущий коннект

    a_voronin
    скорее query wait, чтобы не писать в каждой команде

    Ага. Типа запустил один ssis, а посыпались все коннекты
    Вопрос: вопрос про таймауты

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

    когда нагрузка большая, то таймауты несколько раз в минуту, процессор загружен практически под 100 процентов
    блокировок вроде нет
    посмотрел что много процессов в runnable и сделал вывод что таймауты из-за нехватки процессора
    когда нагрузка маленькая то же таймауты, где-то несколько за час
    как можно определить точную причину? код приложения менять не могу
    Ответ:
    Konst_One
    30% cpu от 50% идёт сейчас на SQL, хотя сам сервер якобы ничем не загружен.
    может у вас какие-нибудь job-ы работают или SSRS например вовсю пашет?


    sql server agent не запущен
    ssrs работает, но никто не пользуется
    приходит 10 -20 бач реквестов в секунду
    среди них есть запросы на выборку большого кол-ва строк
    Вопрос: Интерактивный вызов класс-методов Cache из Вэббраузера (без "Таймаута")

    Доброго времени суток.

    Решил поделиться с коллегами наболевшим. Долгое время раздражала отсутствие интерактивности при работе в Cache' через вэб технологию. Что это значит:
    Допустим нам надо выполнить очень большой SQL запрос, поместить результат в EXEL (xml) файл. , и по окончанию закачать его на сторону клиента, причем самое гадкое в том, что клиент очень желает видеть процесс создания этого файла. А еще веселье в том, что у клиента очень шаловливые ручки, и он любит обновлять страницу, а то и вовсе закроет браузер. При повторной загрузке он конечно же опять нажмет на кнопку старта, и все начнется снова в новом процессе. Мне кажется данная проблема знакома многим.

    Стандартный вызов #server(..Test(Arg1,arg2))# тут явно не поможет.

    Для решения таких задач разработал класс HTML.RunJob

    Опять же приветствуется конструктивная критика, что можно улучшить. Буду очень признателен.

    Пример применения (есть на ginhab):
    Class User.TestRunJob Extends %CSP.Page
    {
    
    ClassMethod OnPage() As %Status
    {
         ;  <script language="JavaScript" type="text/javascript" src="HTML.RunJob.cls"></script>
         ;  <script language="JavaScript" type="text/javascript" src="%25ZHTML.RunJob.cls"></script> 
          
        &html< 
          <script language="JavaScript" type="text/javascript" src="%25ZHTML.RunJob.cls"></script>
          <button onclick='runProcess()'>Запустить процесс</button>
          <button onclick='KillProcess()'>Уничтожить процесс</button>
          <br>
          <br>
          <br>Уничтожить процесс: <button onclick='alert(callJob("..KillProc2",this.innerHTML))' id='KillProc'>---</button>
          <br>
          <br>
          <div id='info'>FrmCache</div>
          <br><progress id='progress' value="0" max="100" style='width:100%'></progress>
          <br>
          <div id='FrmCache'>FrmCache</div>
          <br>
          <br>
          <div id='demo'>eee</div>
          <br>
          <script type="text/javascript" >
          
          // Синхронный запуск класс метода
          // alert(callJob("..Test2"));
    
          // Синхронный запуск класс метода(Полный путь к классметоду)
          alert(callJob("User.TestRunJob.Test2"));
         
          /// функция срабатывает перед вызовом класс метода
          beginFun=function(){
              
          } 
          
          /// функция обработки запроса состояния работы процесса
          ProgressFun=function(arg){
             document.getElementById("demo").innerHTML='Wor progress:'+JSON.stringify(arg);
             if (arg.js!=undefined){  eval(arg.js);    }
             if (arg.UserJob!=undefined){  document.getElementById("KillProc").innerHTML = arg.UserJob;    }
          }
         
          /// функция срабатывает по окончанию работы процесса
          CalBackFun=function(arg){
              // document.getElementById("FrmCache").innerHTML =JSON.stringify(arg);
              document.getElementById("demo").innerHTML='';
              if (''+arg=={}){     alert('Работа закончена')    }
              document.getElementById("progress").value=0;
          }
         
          
          var JobID="MYJoB_3";
          
          /// Параметры обработки запроса
          var param=[beginFun,ProgressFun,CalBackFun,JobID,1000];
          /// запуск процесса повторно после перезагрузки страницы
          refJob(param);
          
          runProcess=function(){
             var res=callJob("..Test",param);
             document.getElementById("demo").innerHTML=res;
          }
          
          KillProcess=function(){
              killJob(JobID) ;
          }
          
         </script>
        >
        w ##class(%SYS.System).InstanceGUID()
        Quit $$$OK
    }
    
    ClassMethod KillProc2(JobProc)
    {
        w $zu(4,JobProc)
    }
    
    ClassMethod Test2()
    {
        w $ZDT($h)
    }
    
    ///Процесс который будет работать  параллельно и очень долго  
    ClassMethod Test()
    {
        
        ; %runjob - имя глобала , через который происходит обмен Web морды и Cache` процесса
        s count=1000
        for a=1:1:count {   
           h 1
           s @%runjob@("info")= " Счетчик внутри процесса "_a
           s val=100\count*a
           s jsCode=""
           s jsCode=jsCode_" document.getElementById(""progress"").max = "_count_"; "
           s jsCode=jsCode_" document.getElementById(""progress"").value = "_a_"; "
           s jsCode=jsCode_" document.getElementById(""FrmCache"").innerHTML ="""_$ZDT($h)_" - "_a_"  "_val_"%"" "
           ; s @%runjob@("eval")=jsCode
           s @%runjob@("js")=jsCode
           s @%runjob@("UserJob")=$JOB
        }
        w $zdt($h)
        s @%runjob@("OK")=1 ; сообщаем Web морде о том, что процесс закончен корректно
        q
    }
    
    }
    
    Ответ: Sheonn,

    Использовать можно
    в классе HTML.RunJob присутствует следующая конструкция (в районе строки 592 -+ 5 строк)
         if (typeof cspCallHttpServerMethod !== 'function') {
             cspCallHttpServerMethod=callJob;
         }
    


    Благодаря этой конструкции, если функция cspCallHttpServerMethod не определена, тогда она определяется.

    Если определить в CSP внутри тэга HEAD
    <HEAD> 
       <script language="JavaScript" type="text/javascript" src="HTML.RunJob.cls"></script>
    </HEAD> 
    

    Перед выполнением Cache добавит пере закрывающим тэгом "</HEAD>" библиотеки "cspxmlhttp.js" и "cspbroker.js"
    и получится конструкция
    <HEAD> 
    <script language="JavaScript" type="text/javascript" src="HTML.RunJob.cls"></script>
    <script language="JavaScript" type="text/javascript" src="/csp/broker/cspxmlhttp.js"></script><script language="JavaScript" type="text/javascript" src="/csp/broker/cspbroker.js"></script></HEAD>
    



    В связи с этим cspCallHttpServerMetho будет сначала создан в HTML.RunJob.cls а затем переопределен в cspxmlhttp.js
    и все будет работать по старому.

    callJob – функция запуска процесса
    refJob - функция восстановления процесса
    killJob - функция уничтожения процесса
    

    Никто не запрещает закомментировать HTML.RunJob условие перед инициализацией , и оставить
    cspCallHttpServerMethod=callJob;
    

    Но надо помнить, что подключать HTML.RunJob надо будет после закрывающего тэга </head> иначе библиотека "cspxmlhttp.js" опять переопределит её.

    Это может понадобится, в тех случаях, когда есть желание использовать HTML.RunJob и есть необходимость скрыть от пользователя имя вызываемого класс метода при применении конструкции:
     #call(..Test([beginFun,ProgressFun,CalBackFun,”JobID”,1000],arg1,arg2) )#
    
    Вопрос: Проблема с доменнной аутентификацией на сервере.

    Приветствую!
    Есть у нас инстанс 2014 MS SQL, с сервис паком и последним кумулятивом. Проблема в том, что он не хочет аутентифицировать доменных юзеров никак. Вообще.
    Режим аутентификации - Смешанный

    Перезагрузки и сервиса и сервера после смены режима производились. Проверено не раз.
    Создаю юзера с аутентификацией Windows из доменной учётки. С этой учёткой, юзер ходит на ресурсы через RDP, по шарам, коннектится через ВПН. То есть учётка нормальная, не битая. Даю этому юзеру права dbo на его бд. Юзер прописывает их в connection string как DOMAIN\User и получает ошибку аутентификации. На стороне SQL

    Меняем аутентификацию на Windows, перезапускаем сервис SQL коннектимся этим юзером (напомню - он доменный), получаем в логе:

    Коннекта нет.
    Какие ещё можно предпринять действия?
    Ответ: 126,

    если приложение само формирует строку подключения, то переписывайте приложение.
    Вопрос: APEX схемы авторизации и аутентификации

    Кто-нить знает где можно надыбать какой-нить документ по АРЕХ-у, где подробно рассматриваются именно его принципы работы? в частности работа схемы авторизации и схемы аутентификации?
    именно принципы работы а не создание.
    С оф. сайта скачал 6 докуметнов e_номер... +) и администраторс гид, и юзерс, и адвансед тьюториал и т.п.... кроме этого надыбал пару документов из инета, нигде серьёзного рассмотрения этих схем нету( в лучшем случае нашёл в юзерс гиде достаточно подробное описание их создания, но конкретики относительно того, как и что будет использовать АРЕХ, куда обращаться при различных вариантах этих схем слишком мало...
    например, есть возможность проводить аутентификацию пользователя из БД или как пользователя самого АРЕХ. встаёт куча вопросов: где хранятся пользователи АРЕХ? какими правами они обладать будут в БД? какими правами будут обладать пользователи если они авторизованы как пользователи БД? что произойдёт если приложению понадобится привилегия, которой у этого пользователя нет? что произойдёт если пользователь имеет больше привилегий чем приложение и попробуем ими воспользоваться? каким образом приложение будет сохранять авторизацию и аутентификацию пользователя?(нашёл только про аутентификацию, а где авторизацию хранит, хз...)
    вобщем вопросов много... конечно на некоторые можно ответить интуитивно, а остальные проверить ручками... но очень нехотелось бы делать каких-то интуитивных предположений т.к. надо написать документ +) а проверять всё ручками несколько долговато. Хотелось бы какой-нить документ найти, который подробно это рассматривает и описывает, как там что работает +) да и вообще по АРЕХ-у в остальном, что и как там работает, как он к апачу обращается и как взаимодействует...
    вобщем если кто знает подобный документ буду благодарен.
    Ответ: pic16f874, я думаю, что форумчане с последней активностью 4 и 7 лет назад соответственно могут не дать ответа на поставленный вопрос. Поэтому рассказывай, кому-нибудь да пригодится.