powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Кто вызвал процедуру?
39 сообщений из 39, показаны все 2 страниц
Кто вызвал процедуру?
    #32052508
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть несколько хранимых процедур, причем они могут быть вызваны либо пользователем, либо другой хранимой процедурой. Как узнать, кто вызвал процедуру, пользователь или другая процедура?
При условии чтоб пользователь вызывая хранимую процедуру, например, из квери аналайзера, не смог бы имитировать вызов из хранимой процедуры.
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052515
Фотография Lexis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sp_who
sp_who2
select * from sysprocesses
dbcc inputbuffer(id_process)

попробуй с этим набором команд
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052546
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как можно получить текущий id_process ?
Как прочесть значение текущего поля из команда dbcc inputbuffer(id_process) ?
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052551
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вообще можно просто узнать, какая хранимая процедура запущена?
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052552
Tulkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
create table #dbcc(EventType nvarchar(30),Parameters int,EventInfo nvarchar(255))
create table #last_stmt(spid int,EventInfo nvarchar(255))

declare @spid int,@dbcc varchar(100)
select * into #sp from master..sysprocesses with (nolock)
declare processes cursor fast_forward for
select spid from #sp
where status<>'background' and dbid<>0

open processes
while (1=1)
{
fetch processes into @spid
if @@fetch_status<>0 break

insert into #dbcc
exec ('dbcc inputbuffer ('+@spid+')')

insert into #last_stmt select @spid,EventInfo from #dbcc

delete from #dbcc
}

close processes
deallocate processes
drop table #dbcc
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052553
Александр Спелицин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
См. @@NESTLEVEL
= 1, если процедура вызвана юзером,
> 1, если вызвана из другой процедуры.

А вообще-то лучше роцедуры разделить на две группы: интерфейсные и внутрисистемные. У пользователей могут быть права на выполнение только интерфейсных процедур. В них происхдят всякие проверки, а также вызовы внутрисистемных процедур, на которые у пользоателей нет никаких прав.
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052555
Tulkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри {...} читать как begin...end
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052566
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>А вообще-то лучше роцедуры разделить на две группы: интерфейсные и внутрисистемные.

@@NESTLEVEL
Честно говоря дырь всеж остается, ибо пользователь может в другой базе (где у него есть права) создать процедуру и вызвать из нее эту, получив тем самым число более 1.
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052567
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>А вообще-то лучше роцедуры разделить на две группы: интерфейсные и внутрисистемные.
Это конечно правильно, так и планировали сделать, но не удалось все так сделать.

>Tulkin
А полегче конструкции нет?
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052572
Tulkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведенный кусок кода делает временную табличку, в которую валятся все текущие активные процессы и последние комманды, запущенные этими процессами. Осталось только выкусить нужный кусок и юзать.
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052582
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Tulkin
Стоп, а как отсюда получить имя запущенной процедуры. Здесь есть имя приложения, но это не интересно.
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052583
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ку?
Код: plaintext
object_name(@@procid)
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052589
Tulkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select @spid,EventInfo from #last_stmt
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052705
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
object_name(@@procid)
Это название той процедуры которая выполняется, а не той что была запущена пользователем.
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052732
VAT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть несколько хранимых процедур, причем они могут быть вызваны либо пользователем, либо другой хранимой процедурой. Как узнать, кто вызвал процедуру, пользователь или другая процедура?

Можно узнать, для чего?
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052736
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>VAT
Чтоб процедура сама проверяла, есть ли у пользователя право ее запускать и какие вействия с ней он может выполнять.
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052738
VAT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не давайте на неё права, и прав не будет.
А если права есть, посмотрите внутри процедуры user_id()
или user_name(), и там решите, что с ним делать
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052739
Makc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для этого есть system_user и session_user
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052745
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там более хитрая ситуация, например процедура удаления должна отдельно проверять право на удаление своих записей и чужих, это два разных права.
Кроме того если процедура вызывается напрямую - это одни права, из другой процедуры - другие.
Вообщем нужно знать, какую именно процедуру запустил пользователь.
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052746
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Underking
object_name(@@procid)
Это название той процедуры которая выполняется, а не той что была запущена пользователем

Я это знаю. И Вы это знаете.
Но кто тогда писал это ?

Как вообще можно просто узнать, какая хранимая процедура запущена?
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052748
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения, я не хотел, конечно, сказать, что
object_name(@@procid) не вернёт "название той процедуры,"... " что была запущена пользователем"
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052752
VAT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.Если известен user_id(), то можно узнать, его это записи или нет.
2.У процедуры всегда права владельца, независимо от того, кто её запустил. Если Вы хотите построить какую-то логику в зависимости через что :-) её запустили, то это неверно.
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052774
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне перед запуском хранимой процедуры нужно проверить, имеет ли право пользователь запускать ее. Если процедура1 запускает процедуру2, то в процедуре2 нужно проверять на право запуска процедуры1. Если просто запустить процедуру2, тогда надо уже проверять другие права.
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052782
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по моему г-н Makc Вам уже ответил...
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052786
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>MiCe
Не совсем, как узнать чей сейчас сеанс работы - это одно. Мне надо знать, какая хранимая процедура запущена пользователем.
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052787
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗАЧЕМ?
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052790
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>MiCe
Я уже писал на четыре мессаги выше, права проверять.
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052797
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
опять не понятно.....
если права ползователя - то Макс уже писал выше session_user
есля права процедуры то и создаваю ее от имени какогото юзера....(create proc user.MyProc ....) и юзай system_user
хотя опять таки у меня в голове не укладывается....
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052799
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть много хранимых процедур, причем одни и те же процедуры могут запускаться либо пользователем, либо другой процедурой. Мне нужно знать, запущена ли процедура пользователем, либо процедурой, причем мне надо знать какой. Мне просто надо различать эти ситуации.
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052808
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create proc myproc1
@procid int =  0 
as 
if @@nestlevel< 10  exec dbo.myproc1 @@PROCID
select @@nestlevel,@@SPID,@@PROCID,@procid
return @@PROCID
go
declare @ret int
select @@nestlevel,@@SPID,@@PROCID
EXEC @ret=[pubs].[dbo].[myproc1]
SELECT name, id FROM sysobjects WHERE id=@ret
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052889
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас где-то в логике ощибка зарыта - чего-то не приходит на ум задачи с такими требованиями. А определить перед запуском процедуры права нельзя? Так в нормальных приложениях делается
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052893
Makc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Underking:
В общем Ваш вопрос выглядит так:
Как мне защитить свою процедуру от вызова из других процедур написанных (возможно) недобросовестными коллегами по работе
Имхо никак, если в нагрузку к существующей писать свою систему разделения прав...
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052897
Tulkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и в чем же меня разводят???
(Новый русский из анекдота про сделку с дьяволом )
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052898
Tulkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибся топиком.
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052948
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разделите на интерфейсные процедуры, предназначенные для запуска пользователем и раздайте на них права и системные процедуры (dbo only).
Пример
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create procedure _do_something
  @a int
as
  ...
go

create procedure do_something
  @a int
as
  exec _do_something @a
go

grant execute do_something to user
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32052997
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>А определить перед запуском процедуры права нельзя?
>Так в нормальных приложениях делается
А причем тут приложение, процедуру не обязательно из приложения запускать.

>В общем Ваш вопрос выглядит так:
>Как мне защитить свою процедуру от вызова из других процедур
Ну примерно так, разрешить запуск процедуры с набором параметров 1 из одной конкретной процедуры, и с наборором параметров 2 из других процедур, или саму по себе.
Пример. Процедура П1 добавляет запись в таблицу услуг. Один из передаваемых параметров - счет. Но его можно передавать только из одной конкретной процедуры П2 (ибо та его сама подставит по своим правилам). Пользователь имеет право запускать только П2. Если он запустит П1 напрямую, ему нужно отказать в доступе.
Если в П1 поставить проверку на конкретного пользователя, чей сейчас сеанс, то это проверка сработает и в случае запуска П2, но она не должна работать в том случае.
Запретить вызов П1 правали самого MSSQL нельзя, ибо на самом деле там более сложные ситуации.

>Разделите на интерфейсные процедуры, предназначенные
>для запуска пользователем и раздайте на них права и
>системные процедуры (dbo only).
Вообщем так и поступили, вернее объявили некоторые процедуры системными, а для пользователя сделали специальные прозрачные процедуры, которые только проверяют права и запускают системные, благо это только для некоторых процедур понадобилось.
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32053012
Makc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-->> Пример. Процедура П1 добавляет запись в таблицу услуг. Один из передаваемых параметров - счет. Но его можно передавать только из одной конкретной процедуры П2 (ибо та его сама подставит по своим правилам). Пользователь имеет право запускать только П2. Если он запустит П1 напрямую, ему нужно отказать в доступе.

Проверку на валидность передаваемых параметров должна делать П2
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32053018
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Под приложением я имел ввиду целиком систему. И Makc правильно отметил. А что у вас возможно "сбоку" в базу залезть? Вот кто пытается это сделать и пускай отвечает за это.
Если у вас проблемма с этим - тогда надо и вопрос корректнне задавать.
Под "сбоку" я имел ввиду не предназначенные для это средства (клиент)
...
Рейтинг: 0 / 0
Кто вызвал процедуру?
    #32053061
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Проверку на валидность передаваемых параметров должна делать П2
Правильно, П2 и проверяет. Но и П1 должна иметь свою проверку на право ее выполнять, причем может быть право запускать П2, но не запускать П1. Если смотреть по праву текущего пользователя, то П1 не знает, запустили ее напрямую или через конкретную процедуру.

>Под приложением я имел ввиду целиком систему.
Вообще клинт - это одно, а сервер - другое. И сервер не должен зависеть от клиента. Сервер должен все уметь делать сам. У меня из квери аналайзера можно отработать любую функцию программы. Клиент - это просто удоблная для пользователя оболочка.

>И Makc правильно отметил. А что у вас возможно "сбоку" в базу
>залезть? Вот кто пытается это сделать и пускай отвечает за это.
Ха, если что-то случиться, виноват будет в первую очередь админ, за то что не доглядел, дал такую возможность. Сервер нужно защитить. Вообще все эти защиты скорее всего реально не понадобятся, скорее всего без клиента никто работать не будет. Но это дырь в программе, которую могут использовать. И будет очень неприятно если кто-то до этого додумается.
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Кто вызвал процедуру?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]