Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 7 [8] 9 10 11   вперед  Ctrl      все
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
SQL Bigot
ты:решается через СТЕ(лишние телодвижения, которые ты почему-то не хочешь счесть лишними)
--------
Финиш :)


Какое-такое CTE?!

И... Букв много. Желательно, таки пример кода увидеть...
22 мар 12, 08:18    [12292650]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Apex
Apex
пропущено...

Я тебе даже больше скажу, эта та самая, которая DDL откатывает только вместе с базой.

Хотя нет, вру, во втором релизе допилили таки.

Ага. Т.е. кроме flashback database добавили еще и flashback table?
22 мар 12, 12:48    [12294313]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
SQL Bigot
Member

Откуда:
Сообщений: 841
pkarklin
Какое-такое CTE?!
И... Букв много. Желательно, таки пример кода увидеть...

"CTE" - это из другой ветки приплелось :) на его месте должно быть "CLR"

+ пример (тож букв хватает)

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
...
 
SQL> CREATE TABLE employees_tst (employee_id NUMBER(6), salary NUMBER(8,2));
 
Table created
 
SQL> insert into employees_tst(employee_id,salary) select level,level*100 from dual connect by level < 10;
 
9 rows inserted
 
SQL> select * from employees_tst;
 
EMPLOYEE_ID     SALARY
----------- ----------
          1     100,00
          2     200,00
          3     300,00
          4     400,00
          5     500,00
          6     600,00
          7     700,00
          8     800,00
          9     900,00
 
9 rows selected
 
SQL> commit;
 
Commit complete
 
SQL> CREATE TABLE emp_audit_tst( emp_audit_id NUMBER(6), up_date DATE,
  2                           new_sal NUMBER(8,2), old_sal NUMBER(8,2) );
 
Table created
 
SQL> 
SQL> CREATE TRIGGER audit_sal_tst
  2    BEFORE UPDATE OF salary ON employees_tst
  3    FOR EACH ROW
  4  DECLARE
  5    PRAGMA AUTONOMOUS_TRANSACTION;
  6  BEGIN
  7    INSERT INTO emp_audit_tst
  8    VALUES
  9      (:old.employee_id
 10      ,SYSDATE
 11      ,:new.salary
 12      ,:old.salary);
 13    COMMIT;
 14  END;
 15  /
 
Trigger created
 
SQL> update employees_tst set salary = salary/(7-employee_id);
 
update employees_tst set salary = salary/(7-employee_id)
 
ORA-01476: divisor is equal to zero
 
SQL> commit;
 
Commit complete
 
SQL> select * from employees_tst;
 
EMPLOYEE_ID     SALARY
----------- ----------
          1     100,00
          2     200,00
          3     300,00
          4     400,00
          5     500,00
          6     600,00
          7     700,00
          8     800,00
          9     900,00
 
9 rows selected
 
SQL> select * from emp_audit_tst;
 
EMP_AUDIT_ID UP_DATE        NEW_SAL    OLD_SAL
------------ ----------- ---------- ----------
           1 22.03.2012       16,67     100,00
           2 22.03.2012       40,00     200,00
           3 22.03.2012       75,00     300,00
           4 22.03.2012      133,33     400,00
           5 22.03.2012      250,00     500,00
           6 22.03.2012      600,00     600,00
 
6 rows selected
22 мар 12, 17:13    [12296963]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
SQL Bigot,

На мой взгляд, абсолютно бесполезный (с практической точки зрения) пример. В таблице ничего не изменилось. В аудит папали не все записи, которые пытались проапдейтить, а только ДО ошибочной записи. Наличие в таблицы аудита значений в поле NEW_SAL, опять же не имеет никакой смысловой нагрузки и не возможно понять, что и зачем пытались сделать с таблицей и почему не сделалось

ЗЫ. Автономные транзакции в Oracle - это круто!
ЗЫЗЫ. Тема row level триггера осталась не расскрыта, IMHO.
22 мар 12, 17:27    [12297111]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67525
Блог
pkarklin
ЗЫЗЫ. Тема row level триггера осталась не расскрыта, IMHO.

Ну ради порядка было бы интересно увидеть реализацию на MSSQL следующего абстрактного примера:

SQL> create or replace package rl as
  2    procedure init;
  3    function get return integer;
  4  end;
  5  /
 
Package created
 
SQL> create or replace package body rl as
  2    cnt integer;
  3    procedure init as begin cnt := 0; end;
  4    function get return integer as begin cnt := cnt + 1; return cnt; end;
  5  end;
  6  /
 
Package body created
 
SQL> create table rldata as select rownum id, '     ' data, cast(null as number)
  2  n from dual connect by level <= 10;
 
Table created
 
SQL> create trigger rldata_bu before update on rldata
  2  begin
  3    rl.init;
  4  end;
  5  /
 
Trigger created
 
SQL> create trigger rldata_bur before update on rldata for each row
  2  begin
  3    :new.n := rl.get;
  4  end;
  5  /
 
Trigger created
 
SQL> select * from rldata;
 
        ID DATA                          N
---------- -------------------- ----------
         1                      
         2                      
         3                      
         4                      
         5                      
         6                      
         7                      
         8                      
         9                      
        10                      
 
10 rows selected
 
SQL> update rldata set data = '  x  ' where mod(id, 2) = 0;
 
5 rows updated
 
SQL> select * from rldata;
 
        ID DATA                          N
---------- -------------------- ----------
         1                      
         2   x                           1
         3                      
         4   x                           2
         5                      
         6   x                           3
         7                      
         8   x                           4
         9                      
        10   x                           5
 
10 rows selected
 
22 мар 12, 17:43    [12297336]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
softwarer,

Небольшое уточнение. Нужен конечный результат (пронумеровать проапдейченные записи)?

        ID DATA                          N
---------- -------------------- ----------
1
2 x 1
3
4 x 2
5
6 x 3
7
8 x 4
9
10 x 5

10 rows selected
22 мар 12, 17:56    [12297459]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67525
Блог
pkarklin, смотря что считать конечным результатом. Например

SQL> update (select * from rldata order by dbms_random.value()) set data =  '  x  ';
 
10 rows updated
 
SQL> select * from rldata;
 
        ID DATA                          N
---------- -------------------- ----------
         1   x                           6
         2   x                           1
         3   x                           8
         4   x                           7
         5   x                           5
         6   x                           4
         7   x                          10
         8   x                           3
         9   x                           2
        10   x                           9
 
10 rows selected
22 мар 12, 18:00    [12297498]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
pkarklin
softwarer,

Небольшое уточнение. Нужен конечный результат (пронумеровать проапдейченные записи)?

        ID DATA                          N
---------- -------------------- ----------
1
2 x 1
3
4 x 2
5
6 x 3
7
8 x 4
9
10 x 5

10 rows selected
тут использована переменная пакета, т.е. нечто записывается в переменную и она живет во время жизни сессии
в MS SQL для этого надо будет как-то изощряться
22 мар 12, 18:03    [12297527]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67525
Блог
SergSuper
тут использована переменная пакета, т.е. нечто записывается в переменную и она живет во время жизни сессии
в MS SQL для этого надо будет как-то изощряться

Насколько я понимаю, в MS SQL для этого будет достаточно локальной переменной в триггере.
22 мар 12, 18:04    [12297534]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
SergSuper
тут использована переменная пакета, т.е. нечто записывается в переменную и она живет во время жизни сессии
в MS SQL для этого надо будет как-то изощряться


А зачем?

USE tempdb
GO

CREATE TABLE T1(
ID int NOT NULL identity(1, 1),
DATA char(5) NULL,
N int NULL
)
GO

INSERT T1 DEFAULT VALUES
GO 10

CREATE TRIGGER UT_T1 ON T1 
FOR UPDATE
AS
IF TRIGGER_NESTLEVEL(@@procid) = 1 
WITH CTE(ID, RN)
AS
(
SELECT
  i.ID,
  ROW_NUMBER() OVER(ORDER BY i.ID) RN
FROM
  inserted i
)
UPDATE
  T
SET
  N = C.RN
FROM
  T1 T
  INNER JOIN CTE C ON
  T.ID = C.ID
GO

UPDATE T1 SET DATA = '  x  ' WHERE ID % 2 = 0
GO 
SELECT
  *
FROM
  T1
GO

DROP TABLE T1


ID          DATA  N
----------- ----- -----------
1 NULL NULL
2 x 1
3 NULL NULL
4 x 2
5 NULL NULL
6 x 3
7 NULL NULL
8 x 4
9 NULL NULL
10 x 5

(10 row(s) affected)
22 мар 12, 18:14    [12297591]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
softwarer
SergSuper
тут использована переменная пакета, т.е. нечто записывается в переменную и она живет во время жизни сессии
в MS SQL для этого надо будет как-то изощряться

Насколько я понимаю, в MS SQL для этого будет достаточно локальной переменной в триггере.
ну в частном случае можно
если функция get имела бы какую-то логику - то уже не так просто
22 мар 12, 18:18    [12297619]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67525
Блог
pkarklin, тут соль во втором примере из написанных мной. Я не знаю способа это сделать в MS, хотя и не собираюсь утверждать, что сделать нельзя.
22 мар 12, 18:18    [12297621]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67525
Блог
SergSuper
если функция get имела бы какую-то логику - то уже не так просто

Логика функции get только в том, что каждое новое значение зависит от предыстории. Я не имел в виду хвалиться пакетами, это просто способ передать контекст между вызовами row level триггера.
22 мар 12, 18:20    [12297634]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
pkarklin
SergSuper
тут использована переменная пакета, т.е. нечто записывается в переменную и она живет во время жизни сессии
в MS SQL для этого надо будет как-то изощряться


А зачем?

ну а если бы переменная не обнулялась и надо было бы считать сколько раз пользователь выполнил вызов функции?
например можно вести статистику сколько какой кусок кода работал времени
22 мар 12, 18:21    [12297642]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
softwarer
pkarklin, тут соль во втором примере из написанных мной. Я не знаю способа это сделать в MS, хотя и не собираюсь утверждать, что сделать нельзя.


Я подумаю, пока буду идти домой...
22 мар 12, 18:23    [12297660]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
SergSuper
например можно вести статистику сколько какой кусок кода работал времени


Гм... При необходимости веду такую статистику, фиксируя моменты отработку кода внутри хп\триггера в таблице AppLog. Триггер только не пойму здесь зачем и запоминание предыдущего значения?
22 мар 12, 18:26    [12297681]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
pkarklin
Гм... При необходимости веду такую статистику, фиксируя моменты отработку кода внутри хп\триггера в таблице AppLog.
с переменной-то и проще и быстрее

pkarklin
Триггер только не пойму здесь зачем и запоминание предыдущего значения?
я неправильно понял суть примера, softwarer хотел узнать как передавать данные между двумя триггерами на одной таблицу
22 мар 12, 18:31    [12297709]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3910
locky
Apex
пропущено...

Хотя нет, вру, во втором релизе допилили таки.

Ага. Т.е. кроме flashback database добавили еще и flashback table?

Нет, flashback table было и до этого. Просто раньше flashback table не умело откатывать DDL, поэтому нужно было откатывать всю базу целиком. А в 11.2 допилили.
22 мар 12, 18:55    [12297807]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Apex
locky
пропущено...

Ага. Т.е. кроме flashback database добавили еще и flashback table?

Нет, flashback table было и до этого. Просто раньше flashback table не умело откатывать DDL, поэтому нужно было откатывать всю базу целиком. А в 11.2 допилили.

Остается с нетерпением ждать flashback view, flashback procedure/function, flashback package
Ну и управления всей этой лабудой не только из rman, но и из pl/sql

ps и не только в EE, но и в SE1/XE
22 мар 12, 18:59    [12297822]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
SQL Bigot
Member

Откуда:
Сообщений: 841
locky
Остается с нетерпением ждать flashback view, flashback procedure/function, flashback package

И зачем ждать: в правильной СУБД это решается одним DDL триггером :)
22 мар 12, 19:15    [12297884]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
SQL Bigot
locky
Остается с нетерпением ждать flashback view, flashback procedure/function, flashback package

И зачем ждать: в правильной СУБД это решается одним DDL триггером :)

??
пример - можно?
22 мар 12, 19:16    [12297890]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Даже если я напишу так:

USE tempdb
GO

CREATE TABLE T1(
ID int NOT NULL identity(1, 1),
DATA char(5) NULL,
N int NULL
)
GO

INSERT T1 DEFAULT VALUES
GO 10

CREATE TRIGGER UT_T1 ON T1 
FOR UPDATE
AS
DECLARE @i int
SET @i = 0
IF TRIGGER_NESTLEVEL(@@procid) = 1  
UPDATE
  T
SET
  @i = N = @i + 1
FROM
  T1 T
  INNER JOIN inserted i ON
  T.ID = i.ID
GO

UPDATE T SET DATA = '  x  ' FROM (SELECT TOP 100 PERCENT * FROM T1 ORDER BY NEWID()) T
GO 
SELECT
  *
FROM
  T1
GO

DROP TABLE T1


или даже курсор в триггере нарисую, результат (рандомная нумерация, заданная "снаружи") не будет достигнута. Проблема в том, что UPDATE в MS SQL не может быть "упорядочен снаружи" и этот порядок соблюден в триггере.
22 мар 12, 20:29    [12298154]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
SergSuper
как передавать данные между двумя триггерами на одной таблицу


В MS SQL (не прибегая к доп. таблицам) это можно сделать через CONTEXT_INFO сессии. Но там всего 128 байт "места".
22 мар 12, 21:03    [12298270]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
SQL Bigot
Member

Откуда:
Сообщений: 841
locky
пример - можно?


http://psoug.org/reference/ddl_trigger.html

На пальцах:
На BEFORE ALTER уровня базы данных тащишь метаданные объекта(ов) посредством DBMS_METADATA.GET_DDL и сохраняешь в журнале с датой.
Устриц ел, есличо.
22 мар 12, 22:30    [12298619]     Ответить | Цитировать Сообщить модератору
 Re: Чем MS SQL Server хуже Oracle Database?  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
SQL Bigot
locky
пример - можно?


http://psoug.org/reference/ddl_trigger.html

На пальцах:
На BEFORE ALTER уровня базы данных тащишь метаданные объекта(ов) посредством DBMS_METADATA.GET_DDL и сохраняешь в журнале с датой.
Устриц ел, есличо.

Ну, на безрыбьи - и так можно.
Хотя чем это отличается от "перед апргрейдом сделайте скрипт объектов, и в случае проблем - накатите старые варианты" - не вижу.
Геморное решение.
22 мар 12, 22:52    [12298692]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 7 [8] 9 10 11   вперед  Ctrl      все
Все форумы / Сравнение СУБД Ответить