powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перевод из MS SQL Server в ORACLE
25 сообщений из 120, страница 2 из 5
Перевод из MS SQL Server в ORACLE
    #39210826
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

Спасибо за ссылку. Правильно ли я понял, что в CONSTRAINT нельзя устанавливать запрет на будущую дату, т.к. в этом случае мне пришлось бы использовать "functions that are not deterministic"?
Только в триггере могу ставить такое ограничение?
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39210870
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
studierenПравильно ли я понялПолагаешь, документация тебя обманывает?
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39213523
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую форумчан!

Как получить весь список внешних ключей?
В MS SQL Server запрос примерно выглядел бы так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
	SC.name AS SchemaName,
	MT.name AS MainTableName,
	ST.name AS SubordinatedTableName,
	FK.name AS ForeignKey,
	FK.is_disabled AS IsDisabled
FROM sys.foreign_keys FK INNER JOIN sys.objects MT ON FK.referenced_object_id = MT.object_id
	INNER JOIN sys.objects ST ON FK.parent_object_id = ST.object_id
	INNER JOIN sys.schemas SC ON ST.schema_id = SC.schema_id
ORDER BY FK.is_disabled DESC, SC.name, MT.name;


А как в ORACLE не знаю. :(

Спасибо заранее за помощь.
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39213555
Фотография Viewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39213570
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viewer,

Thank you very much.
Ушёл изучать скрипты.
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39213576
tbl2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
studierenКак получить весь список внешних ключей?
sys.foreign_keys -> dba_constraints (type = 'R')
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39213578
Фотография Viewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39219746
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В MS Sql Server в триггерах можно ссылаться на логические таблицы "Inserted" и "Deleted". В таблице "Inserted" все введённые новые записи, а в "Deleted" соответственно все удаленные записи.

Как я понял в Oracle я должен добавить перед полем ":new." или ":old.", чтобы получить новое и старое значение. Но это немножко не то. Мне нужно именно в виде таблицы, что-то вроде "Inserted" и "Deleted".
Что для этого надо делать?

P.S.
Хотел создать временную таблицу "на лету" как в MS Sql Server и добавить туда все ":new." и ":old.", ну так в ORACLE нет временных таблиц как в MS Sql Server. Как выйти из ситуации? :(
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39219760
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
studierenКак выйти из ситуации?Менять мировоззрение, читая документацию.
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39220135
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я не понимаю. Написал триггер на вставку и на изменение. Если в таблице меняю что-то, то ORACLE ругается " ... is mutating, trigger/function may not see it ". Прочёл в вышеуказанной ссылке (в предыдущем посте), что нужно написать какой-то COMPOUND TRIGGER при чём для VIEW. Т.е. чтобы триггер у меня начал работать так как мне надо, сначала создаю VIEW и пишу триггер на VIEW. А почему сразу не на таблицу? Бред какой-то. Зачем мне лишнее представление?
В MS SQL Server проще простого. :(
Может я не правильно понимаю?
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39220141
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
studierenНаписал триггер на вставку и на изменение. Если в таблице меняю что-то

А что, просто присвоить нужные новые значения :new не судьба?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39220282
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

После многочисленных экспериментов путём проб и ошибок выяснил следующее:
если триггер на изменение (не важно BEFORE или AFTER), то внутри тела триггера нельзя оказывается ссылаться на таблицу триггера (т.е. на ту таблицу, для которой был написан собственно сам триггер).
Пример.
Допустим у меня есть таблица "Контракт" и есть "Платежи". Хочу скажем проверить общую сумму всех платежей, которая согласно бизнес правилам не должна превышать сумму контракта. Пишу триггер для платежей.
Допустим кто-то ввел 2 платежа: 1000$ и 500$, общая сумма не превышает сумму контракта (1500$). Но кто-то решил подкорректировать сумму: вместо 1000 скажем 1100. Вот тут триггер должен запретить изменение, т.к. общая сумма в таком случае получится 1600$. И как же тогда мне нужно узнать общую сумму платежей?

P.S.
В MS SQL Server нет таких ограничений, можно изменяемые записи сверять со всей таблицей.
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39220294
studieren нет таких ограниченийотвлекись от триггера и подумай, что будет, если два пользователя одновременно вставляют в пределах лимита, но более половины.
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39220301
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39220302
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
афтер статемент,

В любом случае общая сумма не должна превышать. Тот, кто первым успел сохранить "правильные" данные, то его данные должны быть в базе данных. А тот, кто опоздал и его данные уже "кривые", вот тут программа пусть ругает как следует.
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39220308
eev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
studieren,
авторДопустим у меня есть таблица "Контракт" и есть "Платежи". Хочу скажем проверить общую сумму всех платежей, которая согласно бизнес правилам не должна превышать сумму контракта. Пишу триггер для платежей.
Допустим кто-то ввел 2 платежа: 1000$ и 500$, общая сумма не превышает сумму контракта (1500$). Но кто-то решил подкорректировать сумму: вместо 1000 скажем 1100
...
В MS SQL Server нет таких ограничений вопрос, мона?
т.е. если в одном операторе insert вставляешь 2 записи. (нет ещё коммита) и другой меняет (пытается) одну из вставляемых записей. то 1-ая вставка insert увидит изменения от 2-ой? так?
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39220310
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
studierenА тот, кто опоздал и его данные уже "кривые", вот тут программа пусть
ругает как следует.
Обломись. Триггерами (в особенности такими) этого не сделать. Открой для себя мир
транзакций с уровнем выше чем dirty read.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39220313
studierenкто первым успел сохранитья тебе предлагал подумать, а не продолжать демонстрировать непонимание изоляции транзакций.
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39222065
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tru55про мутацию
http://www.sql.ru/faq/faq_topic.aspx?fid=513
Спасибо за ссылку. Прочёл несколько раз, но так и не смог осилить как адаптировать в моём случае.
Не могли бы подсказать?
Допустим есть таблица "контракт".
Код: plsql
1.
2.
3.
4.
5.
6.
7.
Create table Contract
(ContractID Int not null,
ContractNumber varchar2(20) not null,
ContractDate date not null,
Currency char(3) not null,
Amount Number(14, 2) not null,
constraint PK_Contract PRIMARY KEY (ContractID));


Есть также "платежи"
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create table Payment
(ContractID Int not null,
PaymentDate date not null,
Currency char(3) not null,
Amount number(14, 2) not null,
constraint PK_Payment PRIMARY KEY (ContractID, PaymentDate));
/
ALTER TABLE Payment ADD CONSTRAINT FK_Payment_Contract FOREIGN KEY(ContractID)
REFERENCES Contract (ContractID);


Добавляем записи.
Код: plsql
1.
2.
3.
4.
5.
6.
Insert into Contract
Select 1, '1', to_date('20160401', 'YYYYMMDD'), 'USD', 15000 From dual;
/
Insert into Payment
Select 1, to_date('20160405', 'YYYYMMDD'), 'USD', 1000 From Dual
Union All Select 1, to_date('20160406', 'YYYYMMDD'), 'USD', 500 From Dual


Теперь мне нужно запретить пользователю внести любые изменения в сумме платежа, если общая сумма превышает сумму контракта. Как это сделать в Oracle не знаю.
Скажу честно, моего уровня знания не хватает в данном вопросе. Я недавно стал изучать ORACLE.
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39222073
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пересчитывать сумму в родительской записи, а на нее уже повесить проверку
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39222079
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,

В смысле в таблицу "Contract" добавить вычисляемое поле и триггер добавить туда?
Допустим, я так и сделаю. Когда пользователь попытается исправить в платежах, разве триггер контракта тоже заработает?
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39222086
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,

Или я не правильно понял?
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39222108
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да правильно
Примерно так
Код: plsql
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.
tst> create table contract(id number primary key, cur_sum number default 0, max_sum number default 15000);

Table created.

tst> create table payment(id number primary key, c_id number references contract, ammount number);

Table created.

tst> create trigger contr_trg before insert or update on contract
  2  for each row
  3  begin if inserting then
  4           :new.cur_sum := 0;
  5        end if;
  6        if :new.cur_sum > :new.max_sum then
  7           raise_application_error(-20001, 'Cur_sum ('||:new.cur_sum||') > max_sum ('||:new.max_sum||')');
  8        end if;
  9  end;
 10  /

Trigger created.

tst> create trigger paym_trg after insert or update or delete on payment
  2  for each row
  3  begin update contract set cur_sum = cur_sum + nvl(:new.ammount, 0) - nvl(:old.ammount, 0);
  4  end;
  5  /

Trigger created.

tst> insert into contract values(1, 0, 100);

1 row created.

tst> insert into payment values(1, 1, 20);

1 row created.

tst> select * from contract;

        ID    CUR_SUM    MAX_SUM
---------- ---------- ----------
         1         20        100

tst> insert into payment values(2, 1, 90);
insert into payment values(2, 1, 90)
            *
ERROR at line 1:
ORA-20001: Cur_sum (110) > max_sum (100)
ORA-06512: at "U1.CONTR_TRG", line 5
ORA-04088: error during execution of trigger 'U1.CONTR_TRG'
ORA-06512: at "U1.PAYM_TRG", line 1
ORA-04088: error during execution of trigger 'U1.PAYM_TRG'


tst> update payment set ammount=10 where id=1;

1 row updated.

tst> insert into payment values(2, 1, 90);

1 row created.

tst> select * from contract;

        ID    CUR_SUM    MAX_SUM
---------- ---------- ----------
         1        100        100

tst> select * from payment;

        ID       C_ID    AMMOUNT
---------- ---------- ----------
         1          1         10
         2          1         90

tst> 

...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39222123
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,

Спасибо. Я понял Вашу мысль. Любое изменение в платежах нужно с помощью триггера отразить в дополнительном поле в контрактах. Если сумма превышает, то тогда и происходит исключение.
ОК. Если не найду другое решение, то так и сделаю.

Может есть ещё вариант?
К сожалению, не всегда такое решение для меня приемлемо. Есть ещё сложные проверки данных в других таблицах на предмет пересекающихся диапазонов, вот там я в любом случае должен просмотреть все записи в "мутирующей" таблице.


Хорошо, создам дополнительное представление (view) и туда попробую внедрить триггер. Если не ошибаюсь Compound trigger (или как там правильно называется?). Соответственно в клиентском приложении тогда буду иметь дело только с view.
Как тогда решается проблема?
...
Рейтинг: 0 / 0
Перевод из MS SQL Server в ORACLE
    #39222158
eev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
studieren Если не ошибаюсь Compound trigger (или как там правильно называется?). Соответственно в клиентском приложении тогда буду иметь дело только с view.
Как тогда решается проблема?
19080443 Using Compound DML Triggers to Avoid Mutating-Table Error с примером
...
Рейтинг: 0 / 0
25 сообщений из 120, страница 2 из 5
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перевод из MS SQL Server в ORACLE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]