Форум программистов, компьютерный форум, киберфорум
Oracle
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 44

Создание триггера

12.09.2016, 10:54. Показов 1458. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,

имеется приложение на .net, в котором в при регистрации пользователя добавляются в таблицу БД Oracle.
Теперь мне требуется написать триггер в oracle, который при добавлении строки в таблицу автоматически отправит эту строку на сайт, используя его API. Есть ли возможность в Oracle SQL Develope'e написать такой триггер, чтобы он вызывал метод из Visual Stidio, или если нет - то можно ли написать триггер, который при добавлении строки автоматически вызовет метод, написанный на Java?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.09.2016, 10:54
Ответы с готовыми решениями:

Создание триггера
Есть триггер: CREATE OR REPLACE TRIGGER TRG_AIUD_CONTRACT AFTER INSERT OR UPDATE OR DELETE ON CONTRACT FOR EACH ROW ...

Создание триггера
Триггер создается почему-то с ошибками компиляции. Решил совсем упростить задачку и сделал таблицу из двух полей, последовательность и...

Создание триггера для БД Кинотеатр
Суть проблемы в следующем: допусти есть 3 таблицы BILET(ID_BILETA, MESTO, ID_SEANSA, B_CENA), SEANSI(ID_SEANSA, KOFFICIENT) и...

6
476 / 239 / 114
Регистрация: 12.05.2016
Сообщений: 647
12.09.2016, 11:52
Цитата Сообщение от EmoKinder Посмотреть сообщение
чтобы он вызывал метод из Visual Stidio
нафига?

Цитата Сообщение от EmoKinder Посмотреть сообщение
при добавлении строки автоматически вызовет метод, написанный на Java?
нафига?

1) Oracle сам умеет ходить на "сайт, используя его API" почитайте документацию по стандартному пакету UTL_HTTP. Есть некоторые заморочки с SSL, но они, в принципе, решаемы.
2) Если базе принципиально не разрешено ходить "наружу", то напишите на .NET простейший локальный прокси сервис, пусть Oracle на него запрос шлёт по HTTP с , а уже этот прокси сервис будет делать всю остальную работу по отправке строки на внешний ресурс.
0
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 44
12.09.2016, 14:33  [ТС]
По сути, базе можно ходить "наружу".
Просто на сайте сначала нужно отправить первый POST запрос для получения токена, затем распарсить ответ, чтобы сохранить этот токен, а затем добавлять этот токен в Header к запросу с SSL. Мне показалось, что это будет проще реализовать с помощью класса Java, в который просто будут передавать данные, которые добавили в таблицу.
Или я не прав?

P.S. Я еще макакич, поэтому могу писать бред

Добавлено через 2 часа 16 минут
В общем задача выглядит так:
1) Нужно отправить запрос на адрес onlyoffice.eu/api/2.0/authentication с параметрами username и password.
2) Получить в ответе от сервера token.
3) При INSERT'e в таблицу отправлять свеже-добавленные строки(lastname, firstname, email из таблицы USERS) на onlyoffice.eu/api/2.0/people, при этом добавив в Header запроса token.

Как пример, взял
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SET SERVEROUTPUT ON SIZE 40000
  
DECLARE
  req   UTL_HTTP.REQ;
  resp  UTL_HTTP.RESP;
  name  VARCHAR2(256);
  VALUE VARCHAR2(1024);
BEGIN
  UTL_HTTP.SET_PROXY('proxy.my-company.com', 'corp.my-company.com');
  req := UTL_HTTP.BEGIN_REQUEST('http://www-hr.corp.my-company.com');
  UTL_HTTP.SET_HEADER(req, 'User-Agent', 'Mozilla/4.0');
  resp := UTL_HTTP.GET_RESPONSE(req);
  DBMS_OUTPUT.PUT_LINE('HTTP response status code: ' || resp.status_code);
  DBMS_OUTPUT.PUT_LINE('HTTP response reason phrase: ' || resp.reason_phrase);
  FOR i IN 1..UTL_HTTP.GET_HEADER_COUNT(resp) LOOP
    UTL_HTTP.GET_HEADER(resp, i, name, VALUE);
    DBMS_OUTPUT.PUT_LINE(name || ': ' || VALUE);
  END LOOP;
  UTL_HTTP.END_RESPONSE(resp);
END;
Изменил до такого вида, попробовал использовать его, но ничего не получилось.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SET SERVEROUTPUT ON SIZE 40000
  
DECLARE
  req   UTL_HTTP.REQ;
  resp  UTL_HTTP.RESP;
  name  VARCHAR2(256);
  VALUE VARCHAR2(1024);
  
BEGIN
  --UTL_HTTP.SET_PROXY('proxy.my-company.com', 'corp.my-company.com');
  req := UTL_HTTP.BEGIN_REQUEST('onlyoffice.eu/api/2.0/authentication');
  --UTL_HTTP.SET_HEADER(req, 'User-Agent', 'Mozilla/4.0');
  resp := UTL_HTTP.GET_RESPONSE(req);
  DBMS_OUTPUT.PUT_LINE('HTTP response status code: ' || resp.status_code);
  DBMS_OUTPUT.PUT_LINE('HTTP response reason phrase: ' || resp.reason_phrase);
  FOR i IN 1..UTL_HTTP.GET_HEADER_COUNT(resp) LOOP
    UTL_HTTP.GET_HEADER(resp, i, name, VALUE);
    DBMS_OUTPUT.PUT_LINE(name || ': ' || VALUE);
  END LOOP;
  UTL_HTTP.END_RESPONSE(resp);
END;
И сразу-же на 11 строке получил ошибку.

SQL, собственно, не знаю, поэтому хотелось бы понять, что именно тут я делал не так. И не проще ли тригерить SQLем изменение в таблице, а после вызывать код на Jave? А то с этим у меня как-то не ладится.
0
476 / 239 / 114
Регистрация: 12.05.2016
Сообщений: 647
12.09.2016, 15:34
Цитата Сообщение от EmoKinder Посмотреть сообщение
И сразу-же на 11 строке получил ошибку.
Ну, если не ошибаюсь, протокол в URL опускать всё же не стоит, т.е. адрес должен быть "http:// ......
А далее - текст ошибки-то какой ?
0
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 44
12.09.2016, 15:56  [ТС]
Теперь ошибка такая:
Кликните здесь для просмотра всего текста
Error report -
ORA-29273: HTTP request failed
ORA-24247: network access denied by access control list (ACL)
ORA-06512: at "SYS.UTL_HTTP", line 368
ORA-06512: at "SYS.UTL_HTTP", line 1118
ORA-06512: at line 6
29273. 00000 - "HTTP request failed"
*Cause: The UTL_HTTP package failed to execute the HTTP request.
*Action: Use get_detailed_sqlerrm to check the detailed error message.
Fix the error and retry the HTTP request.
0
476 / 239 / 114
Регистрация: 12.05.2016
Сообщений: 647
12.09.2016, 16:09
Версия оракла какая?

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

SQL
1
2
3
4
5
6
 BEGIN
   DBMS_NETWORK_ACL_ADMIN.CREATE_ACL ('acl_onlyoffice.xml','Access to onlyoffice.eu ','MY_USER',TRUE,'connect'); 
   DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL ('acl_onlyoffice.xml','onlyoffice.eu');  
   COMMIT;
 END; 
/
0
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 44
13.09.2016, 12:40  [ТС]
При первом запросе с помощью утилиты Chrom'a(чтобы был пример) с параметрами username и password получаю такой XML:

XML
1
2
3
4
5
6
7
8
9
10
11
<result>
    <count>1</count>
    <status>0</status>
    <statusCode>201</statusCode>
    <response>
        <token>oAf5U23dQqn0cSQzNuOwN7CLW7R+fik4xV5Te7/YZ9IERMivUwUiQA9abO2U+maXGgygOwIZtLoLWFN04q1k4AV0+vGOsJiQadjt+4iOq0vs5mNImH425DsknhPsN9qA1N</token>
        <expires>2017-09-13T09:47:55.0166204+03:00</expires>
        <sms>false</sms>
        <phoneNoise />
    </response>
</result>

Далее я начал разбирать пример кода на сайте, но не смог понять его полностью.
Насколько я понял, в этой части кода ничего менять не требуется:
Oracle 11 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
CREATE OR REPLACE PACKAGE WS_TOOLS
    IS
    FUNCTION callWS(p_url IN VARCHAR2,p_method IN XMLTYPE,p_user IN VARCHAR2 :=NULL,p_pass IN VARCHAR2 :=NULL) RETURN XMLTYPE;
END;
/
CREATE OR REPLACE PACKAGE BODY WS_TOOLS
IS
 
 
--internal function to post http(s) request
FUNCTION httpPost
(
    p_url     IN VARCHAR2,
    p_data    IN CLOB,
    p_timeout IN BINARY_INTEGER DEFAULT 60
) 
    RETURN CLOB
IS
    --
    v_request  utl_http.req;
    v_response utl_http.resp;
    v_buffer   CLOB;
    v_chunk    VARCHAR2(4000);
    v_length   NUMBER;
    v_index    NUMBER;
BEGIN
 
    v_index := 1;
    v_length := NVL(LENGTH(p_data), 0);
 
    -- configure HTTP
    utl_http.set_response_error_check(enable => FALSE);
    utl_http.set_detailed_excp_support(enable => FALSE);
    utl_http.set_transfer_timeout(p_timeout);
 
    -- send request
    v_request := utl_http.begin_request(p_url, 'POST','HTTP/1.1');
    utl_http.set_header(v_request, 'Content-Type', 'text/xml');
    --utl_http.set_header(v_request, 'Content-Length', v_length);
    WHILE v_index <= v_length LOOP
        utl_http.write_text(v_request, SUBSTR(p_data, v_index, 4000));
        v_index := v_index + 4000;
    END LOOP;
 
    -- check HTTP status code for error
    IF v_response.status_code <> utl_http.http_ok THEN   
        raise_application_error(-20400,v_response.status_code || ' - ' || v_response.reason_phrase);
    END IF;
 
    -- get response
    dbms_lob.createtemporary(v_buffer, FALSE);
    v_response := utl_http.get_response(v_request);
    BEGIN
        LOOP
            utl_http.read_text(v_response, v_chunk, 4000);
            dbms_lob.writeappend(v_buffer, LENGTH(v_chunk), v_chunk);
        END LOOP;
    EXCEPTION
        WHEN utl_http.end_of_body THEN NULL;
    END;
    utl_http.end_response(v_response);
 
    RETURN v_buffer;
 
END;
 
 
FUNCTION callWS
(
    p_url IN VARCHAR2,
    p_method IN XMLTYPE,
    p_user IN VARCHAR2 :=NULL,
    p_pass IN VARCHAR2 :=NULL
 
    --p_timeout IN NUMBER := 60
)
    RETURN XMLTYPE
IS

Проблемы начинаются с этого куска кода:

Oracle 11 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
27
28
29
30
31
32
33
34
35
36
v_envelope XMLTYPE;
    v_header XMLTYPE;
    v_response CLOB;
    v_fault XMLTYPE;
    v_sqlerrm VARCHAR2(2000);
BEGIN
    IF p_user IS NOT NULL THEN
        --prepare header
        SELECT
XMLELEMENT(
                "soap:Header",
                XMLELEMENT(
                    "wsse:Security",
                    XMLAttributes(
                        'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' AS "xmlns:wsse"
                    ),
                    XMLELEMENT(
                        "wsse:UsernameToken",
                        XMLAttributes(
                            'UsernameToken-1' AS "wsu:Id",
                            'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd' AS "xmlns:wsu"
                        ),
                        XMLELEMENT(
                            "wsse:Username",
                            'cfront'
                        ),
                        XMLELEMENT(
                            "wsse:Password",
                            XMLAttributes(
                                'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText' AS "Type"
                            ),
                            'cfrontpass'
                        )
                    )
                )
            )

Не могу понять что писать после wsse, а также что это за ссылка "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" ссылка?


Также и в последней части, вроде менять ничего и не нужно, правильно?

Oracle 11 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
SELECT
        XMLELEMENT(
            "soap:Envelope",
            XMLAttributes(
                'http://schemas.xmlsoap.org/soap/envelope/' AS "xmlns:soap"
            ),
            v_header,
            
            XMLELEMENT(
                "soap:Body",
                p_method
            )
        )
    INTO
        v_envelope
    FROM
        dual;
 
    -- POST request
    v_response := httpPost(
        p_url,
        v_envelope.getClobVal(),
        60 -- 60 seconds
    );
    IF v_response IS NULL THEN
        raise_application_error(-20400,'empty response');
    END IF;
 
    -- parse response
    BEGIN
        v_envelope := XMLType(v_response);
    EXCEPTION
        WHEN OTHERS THEN
            raise_application_error(-20400,'can''t parse xml: '||SQLERRM);
    END;
 
    -- check for a fault
    v_fault := v_envelope.EXTRACT(  
        '/soap:Envelope/soap:Body/soap:Fault', 
        'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"'
    );
    IF v_fault IS NOT NULL THEN
        v_sqlerrm := v_fault.EXTRACT('.//faultstring/text()').getStringVal();
        raise_application_error(-20400,'remote error: '||v_sqlerrm);
    END IF;
 
    -- the actual response is the child of the "soap:Body" element
    RETURN v_envelope.EXTRACT(
        '/soap:Envelope/soap:Body/*[position() = 1]', 
        'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"'
    );
END;
 
END;
Был бы очень признателен, если бы помогли допилить этот код.

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

Вот код:
Oracle 11 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
27
28
29
30
31
32
33
CREATE OR REPLACE PROCEDURE publish_cinema_event
( p_username IN VARCHAR2
, p_password IN VARCHAR2
)IS
  req utl_http.req;
  res utl_http.resp;
  --url varchar2(4000) := 'http://alsytto.onlyoffice.eu/api/2.0/authentication.xml?userName=roma@alsy.by&password=cjdCtrhtnyj';
  url VARCHAR2(4000) := 'date.jsontest.com';
  name VARCHAR2(4000);
  buffer VARCHAR2(4000); 
  content VARCHAR2(4000) := '{}';
 
BEGIN
  req := utl_http.begin_request(url, 'POST',' HTTP/1.1');
 -- utl_http.set_header(req, 'user-agent', 'mozilla/4.0'); 
  utl_http.set_header(req, 'content-type', 'application/json'); 
  utl_http.set_header(req, 'Content-Length', LENGTH(content));
 
  utl_http.write_text(req, content);
  res := utl_http.get_response(req);
  -- process the response from the HTTP call
  BEGIN
    LOOP
      utl_http.read_line(res, buffer);
      dbms_output.put_line(buffer);
    END LOOP;
    utl_http.end_response(res);
  EXCEPTION
    WHEN utl_http.end_of_body 
    THEN
      utl_http.end_response(res);
  END;
END publish_cinema_event;

Проблема в том, что
content varchar2(4000) := '{}';
должен содержать username со значением "max@max.ru" и password "maximmaxim".

Так вот, как добавить в content эти две переменные?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.09.2016, 12:40
Помогаю со студенческими работами здесь

Синтаксис триггера
create table test ( test_number number(1), test_varchar varchar(2) ) / create or replace trigger before_insert ...

Вызов процедуры из триггера
Уважаемые знатоки, помогите! В программировании - нуб полнейший. Практикуюсь решая задачки, которые мне придумывают товарищи. Есть...

Запретить действие триггера
как запретить выполнение триггеров для определенной таблицы

Реализация триггера в Oracle 10g
Доброго времени суток! Мне необходимо создать автоинкрементирование в таьлице. Вот этот пример работает: SQL&gt; CREATE TABLE...

Срабатывание триггера дочерней таблицы
Добрый день! Есть 2 связанные таблицы: alter table Table2 add constraint Table2_Table1 foreign key (KEY) references Table1 (KEY) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru