Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подмена текста процедуры (DDL или?)  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
Доброго времени суток!

Есть система учета (Aladdin) сейчас она работает на MS SQL 2000. Хотим перетащить её на MS SQL 2008. При создании хранимых процедур она преобразует свои "шаблоны" в обычный T-SQL, но с использованием старого синтаксиса с "*=" (правых соединений нет, только полные и левые). Например

if exists (select 1
  from sysobjects
  where name = 'ap_test_proc'
  and type = 'P')
  drop procedure dbo.ap_test_proc
go

create procedure dbo.ap_test_proc
  @sid varchar(30) = null
as
begin

select /* список полей */
from
  my_table1,
  my_table2,
where
  my_table1.id=@sid and
  my_table2.id*=my_table1.key_id

end

go

grant execute on dbo.ap_test_proc to PUBLIC

go

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

CREATE TRIGGER [no_proc_from_ald]
ON DATABASE
FOR CREATE_PROCEDURE, ALTER_PROCEDURE
AS
DECLARE @cur_app VARCHAR(50)
SELECT @cur_app = APP_NAME()
IF RTRIM(LTRIM(@cur_app)) = 'A+Z_DEPO'
BEGIN
    DECLARE @proc_text     NVARCHAR(MAX),
            @proc_name     NVARCHAR(512),
            @drop_proc     NVARCHAR(900),
            @new_proc_text NVARCHAR(MAX)

set ansi_warnings on
set concat_null_yields_null on

    SELECT @proc_text = EVENTDATA().value ('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')

    SELECT @proc_name = SUBSTRING (@proc_text, 22, (CHARINDEX(' ', @proc_text, 22) - 24))
    
    SELECT @drop_proc = N'drop procedure dbo.' + @proc_name
    EXEC sp_executesql @drop_proc

-----Вот тут будет свой генератор
    SELECT @new_proc_text = N'create procedure dbo.' + @proc_name + ' @sid varchar(30) = null as begin select ''new_proc_text'' end'
    EXEC sp_executesql @new_proc_text

set ansi_warnings off
set concat_null_yields_null off

END

Всё бы ничего, но тригер срабатывает после создания процедуры, и я получаю сообщение об ошибке
автор

Msg 4147, Level 15, State 1, Procedure ap_test_proc, Line 319
The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.


Как все таки решиь мою задачу?
Буду рад выслушать любые предложения.
1 ноя 10, 08:10    [9709291]     Ответить | Цитировать Сообщить модератору
 Re: Подмена текста процедуры (DDL или?)  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
Up
Есть такая идея. Аладдин посылает всегда один и тотже код:
1. Проверка существования процедуры
2. Удаление процедуры
2.1. Тут вешаем тригер на удаление, в котором меняем уровень совместимости на 80
3. Создание процедуры
3.1. Тут вешаем тригер, в котором удаляем только что согданную аладдином процедуру, меняем уровень совмесимости на нужный, создаем процедуру заново без "*=".

Сейчас на работе проверить не могу, т.к. для тестов есть только 2005. Он для sp_dbcmptlevel требует вызова только при ad hoc level. Но в 2008-ом есть
ALTER DATABASE database_name 
SET COMPATIBILITY_LEVEL = { 80 | 90 | 100 }
1. Будет ли ALTER DATABASE работать из DDL тригера?
2. Как повлияет перекидывание уровня совместимости туда-сюда на работу?
На тестовом 2005-ом sp_dbcmptlevel работает моментально, без особых заморочек.
1 ноя 10, 10:36    [9709896]     Ответить | Цитировать Сообщить модератору
 Re: Подмена текста процедуры (DDL или?)  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Guf
...Но в 2008-ом есть
ALTER DATABASE database_name 
SET COMPATIBILITY_LEVEL = { 80 | 90 | 100 }
...
... и sp_dbcmptlevel тоже ещё не отменили.
1 ноя 10, 11:05    [9710169]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Подмена текста процедуры (DDL или?)  [new]
Кесарь
Member

Откуда:
Сообщений: 676
А всего-то и надо - платить нормально за техподдержку и заменить в рамках техподдержки ядро на новое. Жадность фраера сгубила?
13 фев 17, 10:45    [20206423]     Ответить | Цитировать Сообщить модератору
 Re: Подмена текста процедуры (DDL или?)  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Кесарь
А всего-то и надо - платить нормально за техподдержку и заменить в рамках техподдержки ядро на новое. Жадность фраера сгубила?


Это вы у кого спустя 7 лет спрашиваете?
13 фев 17, 12:04    [20206834]     Ответить | Цитировать Сообщить модератору
 Re: Подмена текста процедуры (DDL или?)  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
У меня, видимо...
Ну а так да, быльём поросло.
Ага, покажите мне контору, в которой программисты распоряжаются баблом работодателя?!
13 фев 17, 12:46    [20207053]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить