Перейти к содержимому
Калькуляторы

delta_billing

Пользователи
  • Публикации

    29
  • Зарегистрирован

  • Посещение

О delta_billing

  • Звание
    Абитуриент
    Абитуриент

Контакты

  • ICQ
    Array
  1. почему вы так думаете и в чём именно заключается проблема? Каждый свое дело делает сам ессно. Но при таком количестве клиентов можно уже заключить договор на эксклюзивную поддержку любого программного продукта, биллинга или еще чего-то, написанием которого занимается группа программистов в пределах договора и выполняет определенные работы в определенные сроки. А не сидит сисадмин и ковыряя в носу пишет на барсике какую-то поделку. Это спецы другого класса, софт другого класса. Если ваш сисадмин говорит что он крутой програмер и одновременно крутой сетевик, цискарь и т.д. и т.п. - отправьте его разговаривать с зеркалом. Крутой кто-то даже крутым геймером быть параллельно не может. Потому что настоящий профессионал 100% рабочего и, возможно, часть нерабочего времени занимается своей областью и только ей. Спец в 2-х областях должен тратить 200% своего времени. И т.д. Это не я придумал, это жизнь такая. Каждая из затрагиваемых при поддержании провайдерской сети задач очень объемна и "текуча". В пределах нескольких тысяч пользователей это еще терпимо, но дальше требуется профессиональное знание по оптимизации сырцекода, работы с бд и т.д. Как и знание рутеров, будь то циска или фря. Иначе вы получите кластер из 4-х ядерных суперсерверов с загрузкой 100%. Ну как-то так. Были у нас тут такие програмисты... Очень важные и крутые ;-) Я ржу до сих пор, когда им объяснял -- сначала на словах, потом на пальцах что такое транкгруппы и с чем их едят. А так да, воистину, "спецы другого класса", не ровня нам колхозникам ;-))) Сисадмина, который ковыряет в носу надо гнать с работы. Впрочем, любого, кто не отбивает бабло, на него затраченное. Видимо, в России это простое правило не работает. Остальные перлы -- бред. Включая про цискаря. Если вам сие не дано -- не надо по себе мерить других ;-)))
  2. Да. Именно так и создавалась наша программа -- с учетом реально больших нагрузок. Что было ДО -- больше годилось как красивая демонстрашка, не более того. Тестовый. Жалко что-ли?
  3. [ Если на файловой системе правильно раздать права, никто пропатчить ваш скрипт не сможет в принципе, если конечно web-сервер не от root запущен. Причем относится это не только к php, но и к tcl/tk и любым другим языкам используемым в подобных условиях. Еще раз, безопасность должна быть на всех уровнях! ] Так было сделано изначально. Заодно, переписали сервер статистики -- убрали пароль юзера из url, переделали логику движка и т.д. http://billingdelta.ru/lite/faq.html#37 Там же еще парочка тестовых логинов. Можно потестить.
  4. Читать надо уметь ;-) Если влом читать и разбираться с кодом -- просто запустить и посмотреть результат.
  5. Это очень легко убрать, пока никто особо не жаловался. К тому-же, как я уже говорил, это проблема пользователей а не комании. Нефиг свои пароли раздавать всем подряд ;-)
  6. Я взял ваши get`ы и скормил серверу. И что произошло, кроме того, что выдало ошибку в некоторых случаях? А что еще должно быть выдать? Все входящие переменые проверяет функция, которая прежде всего, защищает сервер баз данных от возможности пихануть в него левый SQL запрос. Удаляются опасные символы: кавычки, скобки, точка с запятой и пр. а также, любые инструкции SQL. Главное -- защита БД! А то, что пользователь получит ошибку если зафигачит кривой get -- так то его проблемы. В нормальном случае (если не хакерить) этого обычно не происходит. Второй барьер защиты -- все скрипты работают с БД под опеределнным пользоватем с `хитрыми` правами. В любом случае, нанести сильный вред от имени этого пользователя не получится. Пароль `sa` хранится только в моей голове и при нормальной работе системы эта учетная запись вообще не используется. По поводу автоматического управления станцией. Да, поддерживается. Включение/выключение устройств, управление набором услуг ДВО для телефонии (опеределитель, межгород, переадресация и т.д.) Достаточно просто выписать и выполнить наряд и устройство получит/отключит доп. услугу. Циски управляются по SNMP для терминирования активных сессий диалапа, PPPoe и IP телефонии. Для статиков (выделенщики кредитники со статическим внешним IP-ом) управление осуществляется с помощью эмуляции скриптом telnet сессии для конфигурации циски. При отключении за неуплату / при оплате управление состоянием устройства выполняется автоматически (у нас мало персонала, некому руками включать/выключать). Сейчас готовится раздел в `Вопросах и Ответах` где подробно описано как это делается. Пока постараюсь в двух словах. Есть в базе интерфейсная таблица (очередь), куда пишутся задания роботам (например `включить номер`) . Роботы сканируют таблицу и выполняют требуемые операции с оборудованием. Робот, также, анализирует ошибки обработки и пишет в таблицу в запись о задании результат его обработки, что позволяет станционным инженерам отслеживать ошибки.
  7. Согласен. Однако у них в договоре прописано, что всю ответсвенность они несут сами. В крайнем случае, мы найдем, кто стырил пароль т.к. MAC тоже пишется radius log. Есть еще защита такая: мы авторизуем еще и по сочетанию МАКушника абонента и вилана который под его сегмент сети. (это включается по требованию абонента) посему под ним никто не зайдет ;-)
  8. А накой оно нужно? Если интерфейс админа переписать на php - можно в логи писать кто куда заходил и что делал, а заодно избавиться от акцеса, как от пороховой бочки, которая рано или поздно все завалит. И от винды с сервером sql. U Интерфейс не должен вообще никуда ничего писать, и уж тем более, отвечать за безопасность! Такими мерьезными вещами должна заниматься только СУБД. Хотя-бы потому, что скрипт на php (php сам по себе весь дырявый в плане безопасности о чем можно судить по количеству взломанных сайтов) может каким-то образом пропатчить злоумышленник и тогда уж точно ничего никуда писаться не будет. Альтернатива php -- tcl/tk 8.4 Да, весь личный кабинет -- это всего навсего 1 файлик размером около 32 кбайт и 1 гиф с баннером вверху. Верите-нет, пока не взрывается. Причем у нас часть юзеров сидит под Access 2k а часть под A97. Тоже касается MS SQL. Уж чего с ним тут только не было -- и диски дохли, и инвертора горели а он живой назло всему ;-)
  9. [ http://pgfoundry.org/projects/tablelog/ - модуль к постгресу. Правда, использует триггер. ] Сначала не заметил, затем прочитал -- оборжался ;-) Модуль да еще и треггер надо... И диктора Центрального телевидения за кадром ;-))) Вот с помощью этой простой весчи сделан аудит на требуемые таблицы БД. ============================= Cut ======================================================== CREATE PROCEDURE sp_create_audit_trigger @tabname nvarchar (50), @mode int AS /* АСР "ДЕЛЬТА" Процедура создает триггер аудита на заданную таблицу базы данных. Данные выводятся в таблицу audit текущей БД. После выполнения процедуры триггер начинает работать немедленно. Обязательное условие: первое поле в аудируемой таблице должно быть ключевым! Таблица audit также должна быть доступна в базе данных и на нее на INSERT должны быть открыты права _всем_ пользователям. Параметры: @tabname Имя таблицы, на которую надо установить аудит. @mode Режим: 1 - Создать (обновить) триггер. 3 - Удалить триггер. */ DECLARE @action_type int, @obj_id bigint, @obj_name varchar(32), @hostname varchar(32), @a nvarchar (512), @id bigint, @col nvarchar (32), @xtype int, @stype nvarchar (32), @ltype int, @p int, @strSQL nvarchar (512), @debug_sql int, /* тело триггера и переменные */ @open_trigger_sql nvarchar (4000), @close_trigger_sql nvarchar (4000), @close_trigger_sql1 nvarchar (4000), @close_trigger_sql2 nvarchar (4000), @ins_variable_sql nvarchar (4000), @del_variable_sql nvarchar (4000), @variable1_sql nvarchar (4000), @variable2_sql nvarchar (4000), @first_column_sql nvarchar (32), /* UPDATE */ @insert1_sql nvarchar (4000), @insert2_sql nvarchar (4000), @insert3_sql nvarchar (4000), @insert4_sql nvarchar (4000), /* INSERT */ @insert5_sql nvarchar (4000), @insert6_sql nvarchar (4000), @insert7_sql nvarchar (4000), @insert8_sql nvarchar (4000), /* DELETE */ @insert9_sql nvarchar (4000), @insert10_sql nvarchar (4000), @insert11_sql nvarchar (4000), @insert12_sql nvarchar (4000) /* 1- вывести SQL скрипт на экран 0 - выполнить скрипт */ SET @debug_sql = 0 /* cчетчик столбцов таблицы */ SET @p = 0 SET @ins_variable_sql = '' SET @del_variable_sql = '' SET @variable1_sql = '' SET @variable2_sql = '' SET @insert1_sql = '' SET @insert2_sql = '' SET @insert3_sql = '' SET @insert4_sql = '' SET @insert5_sql = '' SET @insert6_sql = '' SET @insert7_sql = '' SET @insert8_sql = '' SET @insert9_sql = '' SET @insert10_sql = '' SET @insert11_sql = '' SET @insert12_sql = '' /* получение ID объекта базы данных */ SET @strSQL = NULL SELECT @id = id, @strSQL = name FROM sysobjects WHERE name = @tabname IF @strSQL = NULL BEGIN RAISERROR ( ' Не найдена исходная таблица в базе данных MAIN! ', 16, 1) RETURN END DECLARE CurFt CURSOR FOR SELECT name, xtype, length FROM syscolumns WHERE id = @id order by colid OPEN CurFt WHILE 1 = 1 BEGIN FETCH FROM CurFt INTO @col, @xtype, @ltype IF @@fetch_status=-1 BREAK; IF @@fetch_status=-2 CONTINUE; IF @p > 0 BEGIN SET @ins_variable_sql = @ins_variable_sql + ', ' SET @del_variable_sql = @del_variable_sql + ', ' SET @variable1_sql = @variable1_sql + ', ' SET @variable2_sql = @variable2_sql + ', ' END ELSE SET @first_column_sql = @col /* первое поле таблицы должно быть ключевое поле! */ /* получение типа данных поля исходной таблицы */ SELECT @stype = CASE name WHEN 'sysname' THEN 'nvarchar (' + LTRIM(RTRIM(STR(@ltype))) + ')' WHEN 'varchar' THEN 'nvarchar (' + LTRIM(RTRIM(STR(@ltype))) + ')' WHEN 'char' THEN 'nvarchar (' + LTRIM(RTRIM(STR(@ltype))) + ')' ELSE name END FROM systypes WHERE xtype = @xtype /* формирование SQL для переменных */ SET @ins_variable_sql = @ins_variable_sql + '@fi' + LTRIM(RTRIM(STR(@p))) + ' ' + @stype SET @del_variable_sql = @del_variable_sql + '@fd' + LTRIM(RTRIM(STR(@p))) + ' ' + @stype SET @variable1_sql = @variable1_sql + '@fd' + LTRIM(RTRIM(STR(@p))) SET @variable2_sql = @variable2_sql + '@fi' + LTRIM(RTRIM(STR(@p))) /* формирование SQL для записи в таблицу аудит - UPDATE */ IF @p BETWEEN 0 AND 10 SET @insert1_sql = @insert1_sql + 'IF (@fi' + LTRIM(RTRIM(STR(@p))) + ' IS NOT NULL AND @fd' + LTRIM(RTRIM(STR(@p))) + ' IS NULL) OR (@fi' + LTRIM(RTRIM(STR(@p))) + ' IS NULL AND @fd' + LTRIM(RTRIM(STR(@p))) + ' IS NOT NULL) OR (@fi' + LTRIM(RTRIM(STR(@p))) + ' != @fd' + LTRIM(RTRIM(STR(@p))) + ') INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fi0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, @fd' + LTRIM(RTRIM(STR(@p))) + ', @fi' + LTRIM(RTRIM(STR(@p))) + ' ) ' IF @p BETWEEN 11 AND 22 SET @insert2_sql = @insert2_sql + 'IF (@fi' + LTRIM(RTRIM(STR(@p))) + ' IS NOT NULL AND @fd' + LTRIM(RTRIM(STR(@p))) + ' IS NULL) OR (@fi' + LTRIM(RTRIM(STR(@p))) + ' IS NULL AND @fd' + LTRIM(RTRIM(STR(@p))) + ' IS NOT NULL) OR (@fi' + LTRIM(RTRIM(STR(@p))) + ' != @fd' + LTRIM(RTRIM(STR(@p))) + ') INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fi0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, @fd' + LTRIM(RTRIM(STR(@p))) + ', @fi' + LTRIM(RTRIM(STR(@p))) + ' ) ' IF @p BETWEEN 23 AND 33 SET @insert3_sql = @insert3_sql + 'IF (@fi' + LTRIM(RTRIM(STR(@p))) + ' IS NOT NULL AND @fd' + LTRIM(RTRIM(STR(@p))) + ' IS NULL) OR (@fi' + LTRIM(RTRIM(STR(@p))) + ' IS NULL AND @fd' + LTRIM(RTRIM(STR(@p))) + ' IS NOT NULL) OR (@fi' + LTRIM(RTRIM(STR(@p))) + ' != @fd' + LTRIM(RTRIM(STR(@p))) + ') INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fi0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, @fd' + LTRIM(RTRIM(STR(@p))) + ', @fi' + LTRIM(RTRIM(STR(@p))) + ' ) ' IF @p BETWEEN 34 AND 48 SET @insert4_sql = @insert4_sql + ' IF (@fi' + LTRIM(RTRIM(STR(@p))) + ' IS NOT NULL AND @fd' + LTRIM(RTRIM(STR(@p))) + ' IS NULL) OR (@fi' + LTRIM(RTRIM(STR(@p))) + ' IS NULL AND @fd' + LTRIM(RTRIM(STR(@p))) + ' IS NOT NULL) OR (@fi' + LTRIM(RTRIM(STR(@p))) + ' != @fd' + LTRIM(RTRIM(STR(@p))) + ') INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fi0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, @fd' + LTRIM(RTRIM(STR(@p))) + ', @fi' + LTRIM(RTRIM(STR(@p))) + ' ) ' /* формирование SQL для записи в таблицу аудит - INSERT */ IF @p BETWEEN 0 AND 10 SET @insert5_sql = @insert5_sql + ' INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fd0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, NULL, @fi' + LTRIM(RTRIM(STR(@p))) + ' ) ' IF @p BETWEEN 11 AND 22 SET @insert6_sql = @insert6_sql + ' INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fd0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, NULL, @fi' + LTRIM(RTRIM(STR(@p))) + ' ) ' IF @p BETWEEN 23 AND 33 SET @insert7_sql = @insert7_sql + ' INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fd0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, NULL, @fi' + LTRIM(RTRIM(STR(@p))) + ' ) ' IF @p BETWEEN 37 AND 48 SET @insert8_sql = @insert8_sql + ' INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fd0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, NULL, @fi' + LTRIM(RTRIM(STR(@p))) + ' ) ' /* формирование SQL для записи в таблицу аудит - DELETE */ IF @p BETWEEN 0 AND 10 SET @insert9_sql = @insert9_sql + ' INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fd0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, @fd' + LTRIM(RTRIM(STR(@p))) + ', NULL ) ' IF @p BETWEEN 11 AND 24 SET @insert10_sql = @insert10_sql + ' INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fd0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, @fd' + LTRIM(RTRIM(STR(@p))) + ', NULL ) ' IF @p BETWEEN 25 AND 36 SET @insert11_sql = @insert11_sql + ' INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fd0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, @fd' + LTRIM(RTRIM(STR(@p))) + ', NULL ) ' IF @p BETWEEN 37 AND 48 SET @insert12_sql = @insert12_sql + ' INSERT INTO audit (username, hostname, data, tabname, rec_id, colname, tran_id, action_type, old, new) VALUES (SYSTEM_USER, HOST_NAME(), GETDATE(), ' + CHAR(39) + @tabname + CHAR(39) + ', @fd0, ' + CHAR (39) + @col + CHAR (39) + ' , @tran_id, @action_type, @fd' + LTRIM(RTRIM(STR(@p))) + ', NULL ) ' SET @p = @p + 1 END DEALLOCATE CurFt /* SQL скрипт триггера */ SET @open_trigger_sql = ' CREATE TRIGGER audit_' + LTRIM(RTRIM(@tabname)) + ' ON ' + LTRIM(RTRIM(@tabname)) + ' FOR INSERT, UPDATE, DELETE AS BEGIN SET NOCOUNT ON DECLARE @action_type int, @tran_id bigint DECLARE ' + @ins_variable_sql + ', ' + @del_variable_sql + ' SELECT TOP 1 @tran_id = req_transactionID FROM master..syslockinfo (nolock) WHERE req_spid = @@spid and req_transactionID <> 0 IF EXISTS(SELECT * FROM INSERTED) BEGIN IF EXISTS(SELECT * FROM DELETED) SET @action_type = 2 /* UPDATE */ ELSE SET @action_type = 1 /* INSERT */ END ELSE SET @action_type = 3 /* DELETE */ IF @action_type = 2 BEGIN DECLARE CurUpd_' + @tabname + ' CURSOR FOR SELECT * FROM deleted D, inserted I WHERE D.' + LTRIM(RTRIM(@first_column_sql)) + ' = I.' + LTRIM(RTRIM(@first_column_sql)) + ' OPEN CurUpd_' + @tabname + ' WHILE 1 = 1 BEGIN FETCH FROM CurUpd_' + @tabname + ' INTO ' + @variable1_sql + ', ' + @variable2_sql + ' IF @@fetch_status=-1 BREAK; IF @@fetch_status=-2 CONTINUE; ' SET @close_trigger_sql = ' END CLOSE CurUpd_' + @tabname + ' DEALLOCATE CurUpd_' + @tabname + ' END IF @action_type = 1 BEGIN DECLARE CurIns_' + @tabname + ' CURSOR FOR SELECT * FROM inserted OPEN CurIns_' + @tabname + ' WHILE 1 = 1 BEGIN FETCH FROM CurIns_' + @tabname + ' INTO ' + @variable2_sql + ' IF @@fetch_status=-1 BREAK; IF @@fetch_status=-2 CONTINUE; ' SET @close_trigger_sql1 = ' END CLOSE CurIns_' + @tabname + ' DEALLOCATE CurIns_' + @tabname + ' END IF @action_type = 3 BEGIN DECLARE CurDel_' + @tabname + ' CURSOR FOR SELECT * FROM deleted OPEN CurDel_' + @tabname + ' WHILE 1 = 1 BEGIN FETCH FROM CurDel_' + @tabname + ' INTO ' + @variable1_sql + ' IF @@fetch_status=-1 BREAK; IF @@fetch_status=-2 CONTINUE; ' SET @close_trigger_sql2 = ' END CLOSE CurDel_' + @tabname + ' DEALLOCATE CurDel_' + @tabname + ' END END ' /* Удаление тариггера */ SET @obj_name = NULL SELECT @obj_name = name FROM sysobjects WHERE name = 'audit_'+ @tabname IF @obj_name != NULL BEGIN SET @strSQL = 'DROP TRIGGER audit_' + @tabname EXEC (@strSQL) END /* Создание тариггера */ IF @mode IN (1, 2) AND @debug_sql = 0 EXEC (@open_trigger_sql + @insert1_sql + @insert2_sql + @insert3_sql + @insert4_sql + @close_trigger_sql + @insert5_sql + @insert6_sql + @insert7_sql + @insert8_sql + @close_trigger_sql1 + @insert9_sql + @insert10_sql + @insert11_sql + @insert12_sql + @close_trigger_sql2) IF @debug_sql != 0 BEGIN PRINT @open_trigger_sql PRINT @insert1_sql PRINT @insert2_sql PRINT @insert3_sql PRINT @insert4_sql PRINT @close_trigger_sql PRINT @insert5_sql PRINT @insert6_sql PRINT @insert7_sql PRINT @insert8_sql PRINT @close_trigger_sql1 PRINT @insert9_sql PRINT @insert10_sql PRINT @insert11_sql PRINT @insert12_sql PRINT @close_trigger_sql2 END GO == eof == А тут результат работы: http://billingdelta.ru/lite/faq.html#19
  10. Кто Вам сказал, что я про мускль отзываюсь не как о поделке? http://archives.postgresql.org/pgsql-novic...06/msg00001.php оно? А вот тут на TCL: http://www.alberton.info/postgresql_table_audit.html В качестве укрепления позиции единственных Дартанянов среди пи**расов Вам помогло бы. http://pgfoundry.org/projects/tablelog/ - модуль к постгресу. Правда, использует триггер. Мало? В гугле забанили, а livesearch на запрос postgresql стабильно отправляет на сайт одной-известной-корпорации? И Вы так и не ответили на вопрос про оракел. Эх, блин. Был у нас тут постгресс. с 2003 по 2006 год. До сих пор мучаемся когда пытаемся оттуда вытащить старые звоночки за те периоды. Большего г*^& в жизни видеть не приходилось. Причина: МЕДЛЕННЫЙ. Все остальное насчет него мало интересно. Персонально вам: Милейший, вы флеймите. Я говорил не про возможности СУБД а биллинга, представленного на рынок. Исходный вопрос остается в силе. По поводу оракла отвечаю. Дорого. Все тоже самое (более удобно, через GUI) можно делать в MsSQL. Кроме того, T-SQL гораздо более читабельный и логичный по сравнению с PL. На sql.ru эта шняга многократно обсуждалась многоми, лень жевать это еще раз.
  11. Какая очередь в абонетском отделе за расшифровкой? У вас вообще интерфейс клиента есть в биллинге? Чтобы он дома смотрел свои детализации, сколько ему влезет? На скриншотах что-то ни одного нет окошка кабинета клиента. Или ему тоже предлагается взгромоздить Access (denied), odbc и прочие "классные функциональные штуки"? Раз уж пошла такая пьянка ;-) http://stat.astelecom.ru Логин: alexandr Пароль: 20051981 это `личный кабинет`. Такой кабинет может быть по любому разделу предоставляемых услуг в т.ч. по обычной телефонии. Заходите, смотрите. Советую посмотреть скорость, с которой программа показывает трафик и историю соединений аккаунта. Выборка данных осуществляется из динамического массива: один день -- одна таблица. Объем записей за сутки превышает 1 млн для агрегированного net flow и 150000 для accounting. Про наш трафик и количество абонентов я писал уже, повторяться не буду. Про нагрузку тоже писал.
  12. Про лан, еще раз повторяю, они отказались в свое время нам писать потому что у них не было тогда и половины того, что нам нужно. О чем они честно признались (и на том спасибо). Про заявленные нами объемы трафика я вообще молчу, умрет этот лан при таких объемах. На нашем сайте что-то не открылось или Вы не смогли что-то прочитать? Может быть не смогли понять? Это уже другая история ;-))) Оптимизировано под стандартное разрешение 1024*768. Есть возможность работать 800*600 (глобальная настройка клиентской части) однако по причине значительного объема отображаемых данных это не очень удобно. 16:9 не надо.
  13. Полное непонимание вопроса. В документации разжевано как раздавать права юзерам на базу. Это я захожу как `sa`, а могу этого не делать, зайти под своей учеткой. Учетная запись пользователя в системе всегда соответсвует логину на sql сервере. Все операции пользователя с данными всегда выполняются от имени этого пользователя что обеспечивает максимальную защиту нанных т.к. она реализована средствами SQL сервера и позволяет вести полный аудит всех интересных нам транзакций чтобы в последствии точно знать, кто из пользователей накосячил и дать по башке. Безопасность тут: http://billingdelta.ru/lite/faq.html#18 Аудит тут: http://billingdelta.ru/lite/faq.html#19 После осмысления материала просьба показать пальцем на биллинг где есть что-то подобное - хотя-бы на зачаточном уровне. Заодно расскажите, как как второе можно сделать на MySQL ;-)
  14. Какая очередь в абонетском отделе за расшифровкой? У вас вообще интерфейс клиента есть в биллинге? Чтобы он дома смотрел свои детализации, сколько ему влезет? На скриншотах что-то ни одного нет окошка кабинета клиента. Или ему тоже предлагается взгромоздить Access (denied), odbc и прочие "классные функциональные штуки"? За услуги МТР абоненты требуют расшифровку. Мы ее обязаны предоставлять по закону на бумажном носителе по первому требованию абонента. Дома абонент и так все видит через web сервер статистики - начисления, оплаты, баланс, расшифровки трафика (телефония, интернет) и т.д. Проблема в том, что бабушки и дедушки из сел (50% наших абонентов) не знают что такое интернет и им надо печатать счета на бумаге! В разделе "о программе" разжевано что может программа и как это делается. Про абонентские web сервисы там уж точно написано.
  15. [ Opera,Mozilla Firefox,Сафари - прекрасные клиенты биллинга, любого ] У нас тоже такое есть -- web интерфейс для дилеров, которые принимают оплаты в ручном режиме и заключают новые договора.