Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PowerBuilder Новый топик    Ответить
 Добавление юзеров?!  [new]
Pers
Member

Откуда: Москва
Сообщений: 83
Всем, Добрый день!
Парни, не могу понять в чем грабли. Добавляю из программы пользователей
Цепочка такая:
PREPARE SQLSA FROM "EXEC sp_adduser ?, ?";
PREPARE SQLSA FROM "EXEC sp_adduser ?, ?";

и т.д. После каждого вызова проверяю SQLCODE.
Ну и вот, добавление одного юзера срабатывает, все Ок. Добавляю следующего-ошибка:
Db Error Code:-1r
DB Error Message: The procedure 'sp_addlogin' cannot be executed within a transaction.
Заранее спасибо.
5 авг 03, 11:58    [288396]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
Может быть попробовать после каждого вызова процедуры ставить COMMIT ?
5 авг 03, 14:07    [288677]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
Pers
Member

Откуда: Москва
Сообщений: 83
Commit есть :)). В том то и дело никак не пойму в чем грабли.
SQLCA.AutoCommit = TRUE еще стоит. Ладно бы если не добовлялся логин и пользователь при первом добавлении. Для следущего добавления это актуально только. Через процедуру тоже не получаеться, сиквел не компилит, требует явное объявление в синтексе, как константу, через переменную не воспринимает.
5 авг 03, 14:43    [288743]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
Если не сложно, полностью код вызова ХП покажите. Может ошибка в чем другом на самом деле, надо посмотреть.
5 авг 03, 14:49    [288758]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
Pers
Member

Откуда: Москва
Сообщений: 83
Грубо это написано так:
ELSE
PREPARE SQLSA FROM "EXEC sp_addlogin ?, '', 'ware'";
EXECUTE SQLSA USING :str_user.login;
IF SQLCA.SQLCODE <> 0 Then
MessageBox ("Îøèáêà", &
"Îøèáêà ñîçäàíèÿ ëîãèíà" + &
"~r~nDBParm: " + SQLCA.DBParm + &
"~r~nDb Error Code:" + String (SQLCA.SQLCODE) + &
"r~n" + "DB Error Message: " + SQLCA. SQLErrText, &
StopSign!, OK!, 1)
This.triggerevent("u_delete")
ELSE
COMMIT;
PREPARE SQLSA FROM "EXEC sp_adduser ?, ?";
EXECUTE SQLSA USING :str_user.login, :str_user.login;
IF SQLCA.SQLCODE <> 0 Then
MessageBox ("Ñîåäèíåíèå ñ áàçîé", &
"Îøèáêà ñîçäàíèÿ ïîëüçîâàòåëÿ" + &
"~r~nDBParm: " + SQLCA.DBParm + &
"~r~nDb Error Code:" + String (SQLCA.SQLCODE) + &
"r~n" + "DB Error Message: " + SQLCA. SQLErrText, &
StopSign!, OK!, 1)
This.triggerevent("u_delete")
ELSE
COMMIT;
PREPARE SQLSA FROM "EXEC sp_addrolemember 'db_owner', ?";
EXECUTE SQLSA USING :str_user.login;
IF SQLCA.SQLCODE <> 0 Then
MessageBox ("Ñîåäèíåíèå ñ áàçîé", &
"Îøèáêà îøèáêà äîáàëåíèÿ ïîëüçîâàòåëÿ â ðîëü" + &
"~r~nDBParm: " + SQLCA.DBParm + &
"~r~nDb Error Code:" + String (SQLCA.SQLCODE) + &
"r~n" + "DB Error Message: " + SQLCA. SQLErrText, &
StopSign!, OK!, 1)
This.triggerevent("u_delete")
ELSE
COMMIT;
5 авг 03, 14:57    [288783]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
Тогда еще вопрос для уточнения:
А в Query Analizer скрипт нормально отрабатывает ? То есть если там батчем накатать создание пары пользователей ?

Если ответ на вопрос будет положительный, то по идее можно попробовать воспользоваться execute immediate - собрать все в стринг и выполнить единым скриптом.
5 авг 03, 15:20    [288833]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
Pers
Member

Откуда: Москва
Сообщений: 83
EXEC sp_addlogin 'Admin1', 'Admin', 'ware'
GO
EXEC sp_adduser 'Admin1', 'Admin1'
go
EXEC sp_addrolemember 'db_owner', 'Admin1'
GO

EXEC sp_addlogin 'Admin2', 'Admin', 'ware'
GO
EXEC sp_adduser 'Admin2', 'Admin2'
go
EXEC sp_addrolemember 'db_owner', 'Admin2'
GO

Без проблем отрабатывает, GO не пречем , без него тоже все ОК из Query Analizer .
5 авг 03, 15:41    [288869]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
Pers
Member

Откуда: Москва
Сообщений: 83
Когда столкнулся с проблемой, начал методом научного тыка искать :)). Для чистоты эксперемента заново сделал:

l_string="EXEC sp_addlogin '" +str_user.login+"', '', 'ware' EXEC sp_adduser '"+str_user.login+"','"+str_user.login+"'"
Все так же, первый добавляется, на втором ошибка:

DB Error Message: Procedure has not been executed or has no results
5 авг 03, 16:23    [288944]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
в процедуре sp_addlogin стоит следующий код, который Вас и рубит:
IF (@@trancount > 0)

begin
raiserror(15002,-1,-1,'sp_addlogin')
return (1)
end


Проверьте из PB, равно ли кол-во транзакций нулю перед и после вызовов ХП:

int i

select top 1 @@trancount
into :i from SysObjects;

if i > 0 then
MessageBox('Error', 'Trancount > 0')
end if


Если транзакции есть перед вызовом, значит у Вас где то они в коде приложения не закрылись своевременно и надо искать ошибку, ну а если сразу после вызова ХП, так значит это у них намудренно и надо COMMIT-ами все открытые транзакции закрывать.
5 авг 03, 17:06    [289024]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
Кстати вдогонку - попробуйте еще отключить AUTOCOMMIT на всякий случай.
5 авг 03, 17:09    [289034]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
KOLCHOZ_POSTEVENT
Guest
Нет варианта,что ко второму употреблению autocommit соскочил на FALSE?
Может messagebox или setmicrohelp поставите строчкой до EXECUTE,шоб понять,что в SQLCA сидит не вообще,а,именно в момент запроса?
5 авг 03, 17:21    [289062]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
Pers
Member

Откуда: Москва
Сообщений: 83

int i

select top 1 @@trancount
into :i from SysObjects;

if i > 0 then
MessageBox('Error', 'Trancount > 0')
end if

При для первого юзвера i= 0, при добавление 2-го i>0.

Интересно, а как другие регистрируют пользователей на сиквеле?
5 авг 03, 17:35    [289093]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
funikovyuri
Member

Откуда: Симферополь
Сообщений: 4045
в EM
5 авг 03, 17:38    [289099]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
Pers
Member

Откуда: Москва
Сообщений: 83
В догонку для KOLCHOZ_POSTEVENT
использую один объект транзакций SQLCA, который создаеться при запуске,
больше ни где disckonnect'a нет, и нет других объектов транзакций.
5 авг 03, 17:40    [289102]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
Pers
Member

Откуда: Москва
Сообщений: 83
Для "funikovyuri" регистрация в ЕМ-это просто супер!!! :))
Следующая ступень для выборки данных пользователем нужно использовать Query Analizer.
5 авг 03, 17:44    [289113]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
funikovyuri
Member

Откуда: Симферополь
Сообщений: 4045
а у вас пользователи сами регистрируются?
5 авг 03, 17:48    [289121]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
Pers
Member

Откуда: Москва
Сообщений: 83
Для "funikovyuri"........
Есть пользователь типа admin, в программе он может ТОЛЬКО добалять пользователей и просматривать аудит, остальное делать не может. Естественно пользователь "менеджер" не может добавлять других пользователей. :)) Вот так.
5 авг 03, 17:53    [289128]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
funikovyuri
Member

Откуда: Симферополь
Сообщений: 4045
Да понимаю я это отлично. Это я просто так развлекаюсь под вечер
5 авг 03, 18:01    [289140]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
Если кол-во транзакций после выполнения добавления первого юзера равно нулю и перед вызовом добавления второго не равно нулю, значит ошибка у вас где то в логике (конечно если только Вы их сразу один за одним в цикле не создаете - но тогда "ничего не понимаю"). Ищите, где то неявно Вы вызываете транзакцию, которую потом не закрываете. Это может быть или SQL прямо в скрипте, или же тот же datawindow.update() без commit (только вот не должно быть этого при включенном AutoCommit). Попробуйте по логике задачи поотлавиливать @@trancount, сделайте в меню вызов MessageBox, который показывает значение @@trancount и заходя в каждый из своих режимов/подрежимов проверяйте, где он начнет увеличиваться. Если хоть примерно место найдете, где сия гадость происходит уже легче будет найти и обезвредить :)
5 авг 03, 18:26    [289196]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
KOLCHOZ_POSTEVENT
Guest
Все так,но нельзя ли в строчку перед exec поставить,что-то в роде:
if SQLCA.autocommit=TRUE then messagebox("","TRUE")
if SQLCA.autocommit=FALSE then messagebox("","FALSE")
Просто для уверенности,что на exec Вы выходите с autocommit,выставленным на true.
5 авг 03, 18:27    [289199]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
PL99
Member

Откуда: Moscow
Сообщений: 1367
2 KOLCHOZ_POSTEVENT
Все так,но нельзя ли в строчку перед exec поставить,что-то в роде:
if SQLCA.autocommit=TRUE then messagebox("","TRUE")
if SQLCA.autocommit=FALSE then messagebox("","FALSE")
Просто для уверенности,что на exec Вы выходите с autocommit,выставленным на true.


Вообще-то, для проверки значения переменной принято использовать отладчик :-)

2 ASCRUS
Кстати вдогонку - попробуйте еще отключить AUTOCOMMIT на всякий случай.
нельзя отключать:

Some DBMSs require you to execute certain SQL statements outside the scope of a transaction. For example, when connected to a SQL Server database, you must execute SQL Data Definition Language (DDL) statements such as CREATE TABLE and DROP TABLE outside a transaction. There are two reasons for this:

· It ensures that the structure of your database cannot change during a transaction.
· It improves database performance, because DDL statements are costly operations to recover.

Therefore, to execute DDL statements or stored procedures containing DDL statements in a SQL Server database, you must set AutoCommit to True to issue the DDL statements outside the scope of a transaction.
5 авг 03, 19:45    [289278]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
cbusel
Member

Откуда: gomel.by
Сообщений: 54
>Интересно, а как другие регистрируют пользователей на сиквеле?
Другие юзают:
  execute immediate :as_SQLStatement using SQLCA;
и не знают кто такой SQLSA.
5 авг 03, 20:28    [289311]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
Pers
Member

Откуда: Москва
Сообщений: 83
Для cbusel:
/*Другие юзают:
execute immediate :as_SQLStatement using SQLCA;
и не знают кто такой SQLSA.*/
А разница есть? . Сочуствую тем, кто не знает кто такой SQLSA :))
Проблема не в том, чем юзать, а в том что есть активная транзакция, при которой EXEC sp_addlogin теряется, не зная в рамках , какой выполнять процедуру.
Поэтому хотелось бы подробнее про @@trancount поговорить с ASCRUS!
Это актуально только для sp_addlogin ?
Т.к. у меня класс DW, где все нужные события сделаны. Для других таблиц все ОК, Засада только при добавлении логинов.
6 авг 03, 11:09    [289738]     Ответить | Цитировать Сообщить модератору
 Re: Добавление юзеров?!  [new]
Pers
Member

Откуда: Москва
Сообщений: 83
Вопрос снят, не хочеться лопатить свой класс DW(не стоит трудов, везде все ок). Использовал стандартный DW. Все работает.
6 авг 03, 12:36    [289966]     Ответить | Цитировать Сообщить модератору
Все форумы / PowerBuilder Ответить