Помогите найти ошибку в тригере

Val55
Дата: 07.02.2013 16:29:03
здраствуйте,
я пытаюсь написать logon trigger который делает запрос с таблицы где находятся данные разрешённых пользователей и если он возвращает данные то надо сделать rollback если ничего не возвращает, то session продолжает работать обычно.
Вот запрос:

select * from [resource].dbo.RP_SOURCES s 
where (ORIGINAL_LOGIN() in (select CAPTION from [resource].dbo.RP_INCLUDES i where i.ID=s.DBUSER_INCLUDE_ID) or s.DBUSER_INCLUDE_ID = -1)
and (ORIGINAL_LOGIN() not in (select CAPTION from [resource].dbo.RP_EXCLUDES e where e.ID=s.DBUSER_EXCLUDE_ID) or s.DBUSER_EXCLUDE_ID= -1)
-- Check the operating user is in the include list and not in the exclude list. This user will be blocked
and (HOST_NAME() in (select CAPTION from [resource].dbo.RP_INCLUDES i where i.ID=s.MACHINE_INCLUDE_ID) or s.MACHINE_INCLUDE_ID = -1)
and (HOST_NAME() not in (select CAPTION from [resource].dbo.RP_EXCLUDES e where e.ID=s.MACHINE_EXCLUDE_ID) or s.MACHINE_EXCLUDE_ID= -1)
and (PROGRAM_NAME() in (select CAPTION from [resource].dbo.RP_INCLUDES i where i.ID=s.PROGRAM_INCLUDE_ID) or s.PROGRAM_INCLUDE_ID = -1)
and (PROGRAM_NAME() not in (select CAPTION from [resource].dbo.RP_EXCLUDES e where e.ID=s.PROGRAM_EXCLUDE_ID) or s.PROGRAM_EXCLUDE_ID= -1)


Вот trigger:

CREATE TRIGGER LogonTriggerFW
ON ALL SERVER 
FOR LOGON
AS
BEGIN
IF EXISTS(select * from [resource].dbo.RP_SOURCES s 
where (ORIGINAL_LOGIN() in (select CAPTION from [resource].dbo.RP_INCLUDES i where i.ID=s.DBUSER_INCLUDE_ID) or s.DBUSER_INCLUDE_ID = -1)
and (ORIGINAL_LOGIN() not in (select CAPTION from [resource].dbo.RP_EXCLUDES e where e.ID=s.DBUSER_EXCLUDE_ID) or s.DBUSER_EXCLUDE_ID= -1)
-- Check the operating user is in the include list and not in the exclude list. This user will be blocked
and (HOST_NAME() in (select CAPTION from [resource].dbo.RP_INCLUDES i where i.ID=s.MACHINE_INCLUDE_ID) or s.MACHINE_INCLUDE_ID = -1)
and (HOST_NAME() not in (select CAPTION from [resource].dbo.RP_EXCLUDES e where e.ID=s.MACHINE_EXCLUDE_ID) or s.MACHINE_EXCLUDE_ID= -1)
and (PROGRAM_NAME() in (select CAPTION from [resource].dbo.RP_INCLUDES i where i.ID=s.PROGRAM_INCLUDE_ID) or s.PROGRAM_INCLUDE_ID = -1)
and (PROGRAM_NAME() not in (select CAPTION from [resource].dbo.RP_EXCLUDES e where e.ID=s.PROGRAM_EXCLUDE_ID) or s.PROGRAM_EXCLUDE_ID= -1))
begin
rollback
end
end


Если я создаю его то тогда никто не может подключится из за тригера.
Помогите найти ошибку
hpv
Дата: 07.02.2013 16:45:52
Val55,

И что возвращает вам первый запрос?
Glory
Дата: 07.02.2013 16:50:22
Val55
Если я создаю его то тогда никто не может подключится из за тригера.
Помогите найти ошибку

Т.е. нужно
- создать ваши таблицы
- заполнить их вашими же данными
- протестировать для всех ваших комбинаций ORIGINAL_LOGIN/HOST_NAME/PROGRAM_NAME
?

ORIGINAL_LOGIN() in (select CAPTION from [resource].dbo.RP_INCLUDES i where i.ID=s.DBUSER_INCLUDE_ID) or s.DBUSER_INCLUDE_ID = -1
если в [resource].dbo.RP_SOURCES s есть запись с s.DBUSER_INCLUDE_ID = -1, то это условие всегда будет TRUE
И так для всех ваших подзапросов
Val55
Дата: 07.02.2013 17:00:15
Если я подключаюсь с У1 который у меня занесён в таблицу и ему нельзя подключаться то при запуске этого запроса я получу это:
Val55
Дата: 07.02.2013 17:02:39
Если я подключаюсь с U2 которого нет в таблице и ему можно подключаться то при запуске этого запроса я получу это:
Val55
Дата: 07.02.2013 17:05:13
После создания тригера я получаю ошибку в обоих случаях (и с U1 и с U2)
Glory
Дата: 07.02.2013 17:06:03
что вернет запрос
select * from [resource].dbo.RP_SOURCES s 
where (s.DBUSER_INCLUDE_ID = -1)
and (s.DBUSER_EXCLUDE_ID= -1)
and (s.MACHINE_INCLUDE_ID = -1)
and (s.MACHINE_EXCLUDE_ID= -1)
and (s.PROGRAM_INCLUDE_ID = -1)
and (s.PROGRAM_EXCLUDE_ID= -1))
Val55
Дата: 07.02.2013 17:51:30
Glory,

Ничего не возвращает.