Подскажите, плиз по SP

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Kotъ-Begemotъ
Сообщения: 250
Зарегистрирован: 25 июл 2007, 21:33

Подскажите, плиз по SP

Сообщение Kotъ-Begemotъ » 27 фев 2008, 07:22

Сделал такую SP:

Код: Выделить всё

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SP_CHECK_USER (
    USERNAME VARCHAR(30))
RETURNS (
    USERID INTEGER,
    USERGROUP INTEGER,
    USERFNAME VARCHAR(35) CHARACTER SET WIN1251,
    WORKID INTEGER,
    USERROLE VARCHAR(30))
AS
DECLARE VARIABLE ISACTIV SMALLINT;
DECLARE VARIABLE ISDENIED TIMESTAMP;
DECLARE VARIABLE CURTIM TIMESTAMP = CURRENT_TIMESTAMP;
BEGIN
 FOR SELECT MU.USERID, MU.FULLNAME, MU.USRGRP, MU.DENIED, MU.ACTIV, MU.UROLE
  FROM MUSERS MU
  WHERE MU.LOGINNAME=:USERFNAME
  INTO :USERID, :USERFNAME, :USERGROUP, :ISDENIED, :ISACTIV, :USERROLE
  DO
   BEGIN
    IF (USERID IS NULL) THEN EXCEPTION EXC_USER_NOT_FOUND;
    IF (ISDENIED IS NOT NULL) THEN EXCEPTION EXC_USER_IS_LOCKED;
    IF (ISACTIV=1) THEN EXCEPTION EXC_USER_ALREADY_LOGGED;
    UPDATE MUSERS M SET M.ACTIV=1 WHERE M.USERID=:USERID;
    WORKID=GEN_ID(GEN_USERWORK_WORKID, 1);
    INSERT INTO USERWORK (WORKID, USERID, START, FINISH, AUTOREC)
     VALUES (:WORKID, :USERID, :CURTIM, :CURTIM, 1);
   END
  /* Procedure Text */
  /*suspend;*/
END^

SET TERM ; ^

GRANT SELECT,UPDATE ON MUSERS TO PROCEDURE SP_CHECK_USER;

GRANT INSERT ON USERWORK TO PROCEDURE SP_CHECK_USER;

GRANT EXECUTE ON PROCEDURE SP_CHECK_USER TO "PUBLIC";
GRANT EXECUTE ON PROCEDURE SP_CHECK_USER TO SYSDBA;
Суть - находит в таблице юзеров нужного по имени логина, и возвращает его идентификаторы - группу, полное имя, и прочее... А до кучи ставит признак активности юзера в таблице юзеров и пишет в таблицу USERWORK факт логина...
Всё компилится, работает, но...

Код: Выделить всё

   with DM.spCheckUser do
    begin
     ParamByName('USERNAME').AsString := Uname;
     try
       ExecProc;
       // В GlUI.UserID будет ноль, как и в остальных переменных :(((((
       [b]GlUI.UserID := ParamByName('USERID').AsInteger;[/b]
       GlUI.UserGroup := ParamByName('USERGROUP').AsInteger;
       if GlUI.UserGroup < 2 then
        GlUI.UserGrpName := 'Администратор'
        else
         GlUI.UserGrpName := 'Диспетчер';
       GlUI.UserFulName := ParamByName('USERFNAME').AsString;
       Role := ParamByName('USERROLE').AsString;
       GlUI.WorkID := ParamByName('WORKID').AsInteger;
      except
       AllowLogin := False;
       Exit;
     end;//try
    end;
Где ошбка, что-то никак не разгляжу :(((.

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 27 фев 2008, 08:50

в курсе что имя регистрозависимо будет ?

процедура в эксперте\isql работает ?

Kotъ-Begemotъ
Сообщения: 250
Зарегистрирован: 25 июл 2007, 21:33

Сообщение Kotъ-Begemotъ » 27 фев 2008, 09:13

Attid писал(а):в курсе что имя регистрозависимо будет ?
процедура в эксперте\isql работает ?
Не будет :) Туда попадает оттранслитерованое и отапперкейсеное строчко :)))
Ошбку нашёл. во WHERE вместо :USERNAME махнул :USERFNAME а замыленным глазом уже не увидел... Ладно, всё хорошо что хорошо кончается :)

Ответить