Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
teCa Member Откуда: Сообщений: 730 |
Сабж. Есть приложение, которые вызывает на сервере хранимую процедуру при логине пользователя, передавая в неё несколько параметров. По тех. документации приложения, если эта процедура вернет ok=1 авторизация одобрена, если ok=0 - приложение отклонит авторизацию. Выглядит эта процедура так: USE [db] GO /****** Object: StoredProcedure [dbo].[login] Script Date: 12/19/2012 16:56:00 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[login] @uid int, @ip varchar(15), @hkey varchar(16) AS SELECT pay_stat AS ok FROM user_account WITH (nolock) WHERE uid = @uid Те, если pay_stat юзера = 1, он войдет в систему, если 0, то нет. Эта часть работает, манипуляции с полем pay_stat, дают результаты. Но если я пытаюсь добавить простую проверку, например: USE [db] GO /****** Object: StoredProcedure [dbo].[login] Script Date: 12/19/2012 16:56:00 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[login] @uid int, @ip varchar(15), @hkey varchar(16), @lock_hkey varchar(16) AS SELECT @lock_hkey = hkey AS ok FROM user_account WITH (nolock) WHERE uid = @uid if (@lock_hkey<>@hkey) begin SELECT 0 AS ok end else begin SELECT 1 AS ok end Вот уже в таком виде, процедура перестает вообще, хоть что-то делать. Хотя отдельно в QA, результат получаю такой, как нужно. Посоветуйте что нибудь плз. |
19 дек 12, 17:12 [13655605] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
teCa, Наверное, в тех.документации приложения описаны и входные параметры процедуры? @lock_hkey среди них значится? |
19 дек 12, 17:19 [13655637] Ответить | Цитировать Сообщить модератору |
teCa Member Откуда: Сообщений: 730 |
Действительно, в силу своего незнания, я объявил её таким образом. delcare после AS дебагер не пропустил =( |
19 дек 12, 17:24 [13655681] Ответить | Цитировать Сообщить модератору |
hpv Member Откуда: Сообщений: 153 |
teCa, Опишите, что значит не работает, ошибку выдает, либо результат не равен ожидаемому и т.д. SELECT @lock_hkey = hkey AS ok FROM user_account WITH (nolock) WHERE uid = @uid Заменить как вариант на DECLARE @lock_hkey varchar(16) = (SELECT hkey AS ok FROM user_account WITH (nolock) WHERE uid = @uid) И убрать из параметров, вообще не понятно зачем эта переменная в параметрах |
19 дек 12, 17:26 [13655691] Ответить | Цитировать Сообщить модератору |
hpv Member Откуда: Сообщений: 153 |
Не пропустил, потому что вы не обернули тело процедуры в begin/end |
||
19 дек 12, 17:27 [13655702] Ответить | Цитировать Сообщить модератору |
teCa Member Откуда: Сообщений: 730 |
Суть в том, что приложение мне передает клиентский ключ. Далее, я должен получить этот ключ из таблички, сравнить его с текущим, если они равны - впустить, если нет - не пускать. Подскажите синтаксис declare в рамках процедуры? |
||
19 дек 12, 17:28 [13655710] Ответить | Цитировать Сообщить модератору |
hpv Member Откуда: Сообщений: 153 |
ALTER PROCEDURE [dbo].[login] @uid int, @ip varchar(15), @hkey varchar(16), AS BEGIN DECLARE @lock_hkey varchar(16) = (SELECT hkey FROM user_account WITH (nolock) WHERE uid = @uid) if (@lock_hkey <> @hkey) begin SELECT 0 AS ok end else begin SELECT 1 AS ok end END Как-то так |
19 дек 12, 17:33 [13655741] Ответить | Цитировать Сообщить модератору |
teCa Member Откуда: Сообщений: 730 |
А какую часть именно требуются обертывать? USE [db] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[login] @uid int, @ip varchar(15), @hkey varchar(16), AS DECLARE @lock_hkey varchar(16) = (SELECT hkey FROM dbo.account_lock WITH (nolock) WHERE uid = @uid) if (@lock_hkey<>@hkey) begin SELECT 0 AS ok end else begin SELECT 1 AS ok end Сейчас дебаг не проходит, ругается на AS
|
||||||
19 дек 12, 17:36 [13655758] Ответить | Цитировать Сообщить модератору |
teCa Member Откуда: Сообщений: 730 |
|
||||
19 дек 12, 17:38 [13655767] Ответить | Цитировать Сообщить модератору |
teCa Member Откуда: Сообщений: 730 |
Все понял, лишняя запятая. |
||||||
19 дек 12, 17:39 [13655778] Ответить | Цитировать Сообщить модератору |
teCa Member Откуда: Сообщений: 730 |
Один фиг не работает =( Написал простую процедуру, которая запишет поступившие параметры. USE [ldb] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[auth_login] @uid int, @ip varchar(15), @hkey varchar(16) AS begin insert into db.dbo.account_lock (uid,hkey,lock) values (@uid,@hkey,1) end В результате, ничего в таблицу account_lock не попадает. Как можно узнать, запускалась ли процедура и каков результат её работы? |
19 дек 12, 20:30 [13656448] Ответить | Цитировать Сообщить модератору |
_djХомяГ
Guest |
А как и откуда процедуру запускаете |
19 дек 12, 22:10 [13656682] Ответить | Цитировать Сообщить модератору |
_djХомяГ
Guest |
смотрите профайлером - настриваете соотв события и смотрите что происходит в момент вызова |
19 дек 12, 22:12 [13656683] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
Занудства ради, begin/end для тела процедуры не являются обязательными: create proc ppp @a int as declare @b int; set @b = 1; select @a + @b; go exec ppp @a = 3; go drop proc ppp; go |
||||
20 дек 12, 09:33 [13657805] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |