Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Хранимая процедура  [new]
Чип&Дейл
Guest
Добрый день уважаемые знатоки)
Возник такой вопрос как из системной хранимки сделать обычную?
Или какую часть из sp_helprotect вытащить для того чтобы запросом получать разрешения на объекты для роли бд
17 ноя 15, 12:25    [18428604]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Glory
Member

Откуда:
Сообщений: 104751
Чип&Дейл
Возник такой вопрос как из системной хранимки сделать обычную?

никак

Чип&Дейл
Или какую часть из sp_helprotect вытащить для того чтобы запросом получать разрешения на объекты для роли бд

посмотреть текст процедуры не судьба ?
17 ноя 15, 12:28    [18428629]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Чип&Дейл
Guest
Я все же надеялся что можно как то сделать копию системной обычной хранимкой, смотрел но так и не понял какой из запросов это делает
+
USE [UNGPassing]
GO
/****** Object:  StoredProcedure [sys].[sp_helprotect]    Script Date: 11/17/2015 14:49:33 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [sys].[sp_helprotect]
	@name				ncharacter varying(776)  = NULL
	,@username			sysname  = NULL
	,@grantorname		sysname  = NULL
	,@permissionarea	character varying(10)  = 'o s'
as

/********
Explanation of the parms...
---------------------------
@name:  Name of [Owner.]Object and Statement; meaning
for sysprotects.id and sysprotects.action at the
same time; thus see parm @permissionarea.
   Examples-   'user2.tb'  , 'CREATE TABLE', null

@username:  Name of the grantee (for sysprotects.uid).
   Examples-   'user2', null

@grantorname:  Name of the grantor (for sysprotects.grantor).
   Examples-   'user2' --Would prevent report rows which would
                       --  have 'dbo' as grantor.

@permissionarea:  O=Object, S=Statement; include all which apply.
   Examples-   'o'  , ',s'  , 'os'  , 'so'  , 's o'  , 's,o'
GeneMi
********/

	set nocount on

	declare
	@vc1                   sysname
	,@Int1                  integer

	declare
	@charMaxLenOwner		character varying(11)
	,@charMaxLenObject		character varying(11)
	,@charMaxLenGrantee		character varying(11)
	,@charMaxLenGrantor		character varying(11)
	,@charMaxLenAction		character varying(11)
	,@charMaxLenColumnName	character varying(11)

	declare
	@OwnerName				sysname
	,@ObjectStatementName	sysname
	,@schid			integer
	,@grantor		integer
	,@grantee		integer

	/* Perform temp table DDL here to minimize compilation costs*/
CREATE TABLE #t1_Prots(
		Id					int			Null
		,Type1Code			char(6)		collate database_default NOT Null
		,ObjType				char(2)		collate database_default Null

		,ActionName			varchar(4)	collate Latin1_General_CI_AS_KS_WS NOT NULL
		,ActionFullName		nvarchar(60)	collate database_default Null
		,ActionCategory		tinyint not null
		,ProtectTypeName	char(10)	collate database_default Null

		,ColId				int			Null

		,OwnerName			sysname		collate database_default NOT Null
		,ObjectName			sysname		collate database_default NOT Null

		,GranteeId			int			NOT Null
		,GrantorId			int			NOT Null
		,GranteeName			sysname		collate database_default NOT Null
		,GrantorName			sysname		collate database_default NOT Null

		,ColumnName			sysname		collate database_default Null
		)


	/*	Check for valid @permissionarea */
	select @permissionarea = upper( isnull(@permissionarea,'?') )

	IF (	 charindex('O',@permissionarea) <= 0
		AND  charindex('S',@permissionarea) <= 0)
	begin
		raiserror(15300,-1,-1 ,@permissionarea,'o,s')
		return (1)
	end

	select @vc1 = parsename(@name,3)

	/* Verified db qualifier is current db*/
	IF (@vc1 is not null and @vc1 <> db_name())
	begin
		raiserror(15302,-1,-1)  --Do not qualify with DB name.
		return (1)
	end

	/*  Derive OwnerName and @ObjectStatementName*/
	select	@OwnerName				=	parsename(@name, 2)
			,@ObjectStatementName	=	parsename(@name, 1)

	IF (@ObjectStatementName is NULL and @name is not null)
	begin
		raiserror(15253,-1,-1,@name)
		return (1)
	end

	if (@OwnerName is not null)
	begin
		select @schid = schema_id(@OwnerName)
		-- assign void schema id if not valid
		if (@schid is null)
			select @schid = 0	
	end

	if (@username is not null)
	begin
		select @grantee = database_principal_id(@username)
		if (@grantee is null)
			select @grantee = -1	-- assign void user id
	end

	if (@grantorname is not null)
	begin
		select @grantor = database_principal_id(@grantorname)
		if (@grantor is null)
			select @grantor = -1	-- assign void user id
	end

	/*	Copy info from sysprotects for processing	*/
	IF charindex('O',@permissionarea) > 0
	begin
		/*	Copy info for objects	*/
		INSERT	#t1_Prots
        (	Id
			,Type1Code

			,ObjType
			,ActionName
			,ActionCategory
			,ProtectTypeName

			,ColId
			,OwnerName
			,ObjectName
			,GranteeId
			,GrantorId
			,GranteeName
			,GrantorName
			,ColumnName)

	/*	1Regul indicates action can be at column level,
		2Simpl indicates action is at the object level */
		select	sysp.major_id
				,case when sysp.type in ('RF','SL','UP') then '1Regul'
					else '2Simpl'
				end

				,obj.type collate database_default
				,sysp.type collate database_default
				,sysp.class
				,sysp.state collate database_default
				,sysp.minor_id
				,schema_name(obj.schema_id)
				,obj.name
				,sysp.grantee_principal_id
				,sysp.grantor_principal_id
				,user_name(sysp.grantee_principal_id)

				,user_name(sysp.grantor_principal_id)
				,'.'
		from	sys.database_permissions sysp
		join sys.all_objects obj on obj.object_id = sysp.major_id
		where sysp.class = 1
		and (@schid is null or obj.schema_id = @schid)
		and	(@ObjectStatementName is null or obj.name = @ObjectStatementName)
		and	(@grantee is null or sysp.grantee_principal_id =  @grantee)
		and	(@grantor is null or sysp.grantor_principal_id = @grantor)

		IF EXISTS (select * from #t1_Prots)
		begin

			-- Indicate entries where column level action pertains to all columns in table
			update #t1_Prots set ColumnName = '(All)'
			where #t1_Prots.ColId = 0 and #t1_Prots.Type1Code = '1Regul'
			and	not exists
				(select * from #t1_Prots col
				where col.Id = #t1_Prots.Id and col.ColId > 0 and
				col.GranteeId = #t1_Prots.GranteeId and col.GrantorId = #t1_Prots.GrantorId and
				col.ActionName = #t1_Prots.ActionName)

			-- Indicates actions pertain to new columns. (i.e. table-level permission)
			-- Views and functions don't get new columns
			update #t1_Prots set ColumnName = case ColumnName when '(All)' then '(All+New)' else '(New)' end
			where ColId = 0 and ObjType = 'U' and Type1Code = '1Regul'

			-- Indicate entries where column level action pertains to only some of columns in table
			update #t1_Prots set ColumnName = col_name(#t1_Prots.Id, #t1_Prots.ColId)
			where #t1_Prots.Type1Code = '1Regul' and #t1_Prots.ColId > 0

			-- Propagate object-level SL/UP/RF permission to columns as appropriate
			insert #t1_Prots (
				Id
				,Type1Code

				,ObjType
				,ActionName
				,ActionCategory
				,ProtectTypeName

				,ColId
				,OwnerName
				,ObjectName
				,GranteeId
				,GrantorId
				,GranteeName
				,GrantorName
				,ColumnName)
			select c.object_id
					,'1Regul'
					,o.type collate database_default
					,p.type collate database_default
					,p.class
					,p.state collate database_default
					,c.column_id
					,schema_name(o.schema_id)
					,o.name
					,p.grantee_principal_id
					,p.grantor_principal_id
					,user_name(p.grantee_principal_id)
					,user_name(p.grantor_principal_id)
					,c.name
			from sys.columns c join sys.database_permissions p on p.class = 1 and p.major_id = c.object_id and p.minor_id = 0 and p.type in ('RF','SL','UP')
				join sys.all_objects o on o.object_id = c.object_id
			where not exists
					(select * from sys.database_permissions m
					where m.class = 1 and m.major_id = p.major_id and m.minor_id = c.column_id
					and m.grantee_principal_id = p.grantee_principal_id and m.grantor_principal_id = p.grantor_principal_id
					and m.type = p.type)
				and exists
					(select * from sys.database_permissions n
					where n.class = 1 and n.major_id = p.major_id and n.minor_id > 0
					and n.grantee_principal_id = p.grantee_principal_id and n.grantor_principal_id = p.grantor_principal_id
					and n.type = p.type)

		end
	end


	/* Handle statement permissions here*/
	IF (charindex('S',@permissionarea) > 0)
	begin
	   /*	All statement permissions are 2Simpl */
		INSERT	#t1_Prots
			 (	Id
				,Type1Code
				,ObjType
				,ActionName

				,ActionCategory
				,ProtectTypeName
				,ColId
				,OwnerName

				,ObjectName
				,GranteeId
				,GrantorId
				,GranteeName
				,GrantorName
				,ColumnName )
		select	0
				,'2Simpl'
				,Null
				,type collate database_default
				,class
				,state collate database_default
				,-123
				,'.'
				,'.'
				,grantee_principal_id
				,grantor_principal_id
				,user_name(grantee_principal_id)
				,user_name(grantor_principal_id)
				,'.'
		from	sys.database_permissions
		where class = 0 and major_id = 0
			and	(@grantee is null or grantee_principal_id =  @grantee)
			and	(@grantor is null or grantor_principal_id = @grantor)
			and	(@ObjectStatementName is null or permission_name = @ObjectStatementName)
			
	end


	IF NOT EXISTS (select * from #t1_Prots)
	begin
		raiserror(15330,-1,-1)
		return (1)
	end

	-- Don't show any Revoke rows (Shiloh compat)
	DELETE #t1_Prots WHERE ProtectTypeName = 'R'
	
	-- Translate ProtectTypeName and ActionFullName to full name, using Shiloh values when possible
	UPDATE #t1_Prots
		SET ProtectTypeName = CASE ProtectTypeName
			WHEN 'G' THEN 'Grant' WHEN 'D' THEN 'Deny' WHEN 'W' THEN 'Grant_WGO' END
		, ActionFullName = ISNULL(
			(SELECT v.name FROM sys.syspalnames v WHERE v.class = 'HPRT' AND v.value = ActionName),
			permission_name(ActionCategory, ActionName) )

	/*	Calculate dynamic display col widths		*/
	select
	@charMaxLenOwner       =
		convert ( varchar, max(datalength(OwnerName)))

	,@charMaxLenObject      =
		convert ( varchar, max(datalength(ObjectName)))

	,@charMaxLenGrantee     =
		convert ( varchar, max(datalength(GranteeName)))

	,@charMaxLenGrantor     =
		convert ( varchar, max(datalength(GrantorName)))

	,@charMaxLenAction      =
		convert ( varchar, max(datalength(ActionFullName)))

	,@charMaxLenColumnName  =
		convert ( varchar, max(datalength(ColumnName)))
	from	#t1_Prots

/*  Output the report	*/
EXECUTE(
'set nocount off

select	''Owner''		= substring (OwnerName   ,1 ,' + @charMaxLenOwner   + ')

		,''Object''		= substring (ObjectName  ,1 ,' + @charMaxLenObject  + ')

		,''Grantee''	= substring (GranteeName ,1 ,' + @charMaxLenGrantee + ')

		,''Grantor''	= substring (GrantorName ,1 ,' + @charMaxLenGrantor + ')

		,''ProtectType''= ProtectTypeName

		,''Action''		= substring (ActionFullName collate database_default,1 ,' + @charMaxLenAction + ')

		,''Column''		= substring (ColumnName ,1 ,' + @charMaxLenColumnName + ')
   from	#t1_Prots
   order by
		ActionCategory desc
		,Owner			,Object
		,Grantee			,Grantor
		,ProtectType		,Action
		,ColId  --Multiple  -123s  ( <0 )  possible

set nocount on'
)

return (0) -- sp_helprotect


Сообщение было отредактировано: 17 ноя 15, 12:52
17 ноя 15, 12:50    [18428748]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Чип&Дейл,
"Я все же надеялся "

а нафига простыню с процедурой сюда вписали?
17 ноя 15, 12:51    [18428752]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Glory
Member

Откуда:
Сообщений: 104751
Чип&Дейл
Я все же надеялся что можно как то сделать копию системной обычной хранимкой,

Сделать копию и сделать системную процедуру пользовательской - это разные вещи

Чип&Дейл
мотрел но так и не понял какой из запросов это делает

А комментарии не пробовали читать ?
17 ноя 15, 12:52    [18428754]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Чип&ltqk
Guest
Glory,

Не совсем правильно выразился в формулировки вопроса.
17 ноя 15, 13:26    [18428965]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Чип&Дейл,

==> Или какую часть из sp_helprotect вытащить для того чтобы запросом получать разрешения на объекты для роли бд

Да просто собери динамически GRANT на обьект для роли вот и все.

Или оберни системную процедуру в свою.
17 ноя 15, 13:27    [18428970]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Чип&Дейл
Guest
Jaffar,

Как обернуть системную в свою? В своей процедуре вызвать системную и все?
17 ноя 15, 13:44    [18429107]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Glory
Member

Откуда:
Сообщений: 104751
Чип&Дейл
Как обернуть системную в свою?

Что ?
Чип&Дейл
В своей процедуре вызвать системную и все?

Что вы пытаетесь сотворить ?
17 ноя 15, 13:59    [18429220]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Чип&Дейл
Guest
Glory,

Я хочу получать разрешения для какой-либо роли не из системной процедуры а из пользовательской, мне большего не надо)
Jaffar предложил обернуть системную процедуру в свою, я так понял нужно сделать вызов системной процедуры из своей. Я не правильно понял предложение Jaffara?
17 ноя 15, 14:11    [18429303]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8584
Чип&Дейл, не пойму, зачем Вам давать административные запросы пользователям? Нечего им там делать.
17 ноя 15, 14:17    [18429363]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Glory
Member

Откуда:
Сообщений: 104751
Чип&Дейл
Я хочу получать разрешения для какой-либо роли не из системной процедуры а из пользовательской, мне большего не надо)

И что вам мешает это сделать ?
17 ноя 15, 14:21    [18429404]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Чип&Дейл
Guest
В том то и дело что это будет не у пользователей)
Это будет у админов в приложении
17 ноя 15, 14:23    [18429423]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8584
Чип&Дейл,
а что в справке?

sp_helprotect
Разрешения
--------------------------------------------------------------------------------
Необходимо быть членом роли public.
17 ноя 15, 14:25    [18429445]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Glory
Member

Откуда:
Сообщений: 104751
Чип&Дейл
Это будет у админов в приложении

В чем смысл пользовательской процедуры, которая состоит из единственной команды вызова системной процедуры ?
17 ноя 15, 14:26    [18429453]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
o-o
Guest
Чип&Дейл
В том то и дело что это будет не у пользователей)
Это будет у админов в приложении

вменяемый админ будет смотреть все интересующие его разрешения
цивильными путями.
а никак не через sp_helprotect некие огрызыши прав, к-ые вы уже черт знает сколько времени спрашиваете,
как отобразить в вашем приложении
BOL
sp_helprotect does not return information about securables that were introduced in SQL Server 2005. Use sys.database_permissions and fn_builtin_permissions instead.
17 ноя 15, 14:31    [18429510]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Чип&Дейл
Guest
Чтобы админы могли из приложения менять права а не на сервере. Зачем делать двойную работу? Я не знаю, по мне так проще открыть ssms и поставить галочки там где нужно. Есть еще такой момент что сейчас все пользователя приложения коннектятся с правами owner чего тоже не должно быть, для этого теперь сделано 3 роли web, admin, blacklist у каждой свои разрешения и вот admin будет управлять разрешениями не с ssms а из вне. Возможно я что то упустил но вроде бы задачу поставили такую.
17 ноя 15, 14:44    [18429608]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Чип&Дейл
Guest
o-o,

Так Вы мне подскажите цивильные пути)
17 ноя 15, 14:46    [18429621]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Чип&Дейл
Чтобы админы могли из приложения менять права а не на сервере. Зачем делать двойную работу? Я не знаю, по мне так проще открыть ssms и поставить галочки там где нужно. Есть еще такой момент что сейчас все пользователя приложения коннектятся с правами owner чего тоже не должно быть, для этого теперь сделано 3 роли web, admin, blacklist у каждой свои разрешения и вот admin будет управлять разрешениями не с ssms а из вне. Возможно я что то упустил но вроде бы задачу поставили такую.



это теплое и мягкое.
Админы могут установить не какое-то приложение, а SSMS на рабочей станции и менять права (и не только) не на сервере.
С одной стороны.
Ну и даже в вашем приложении почему не использовать имеющуюся процедуру, а не заматывать её в свою?
Получается - лисапед.
17 ноя 15, 14:47    [18429630]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Glory
Member

Откуда:
Сообщений: 104751
Чип&Дейл
Чтобы админы могли из приложения менять права а не на сервере.

Они смогут менять права только если вызовут вашу пользовательскую процедуру для просмотра списка прав ?
Если они вызовут сразу sp_helprotect, то они не смогут поменять права ?

Чип&Дейл
Зачем делать двойную работу?

По-моему, вы как раз сейчас и занимаетесь созданием двойной работы

Чип&Дейл
Есть еще такой момент что сейчас все пользователя приложения коннектятся с правами owner чего тоже не должно быть, для этого теперь сделано 3 роли web, admin, blacklist у каждой свои разрешения и вот admin будет управлять разрешениями не с ssms а из вне. Возможно я что то упустил но вроде бы задачу поставили такую.

Так и непонятно, зачем для этого заменять системную процедуру на пользовательскую

Сообщение было отредактировано: 17 ноя 15, 14:49
17 ноя 15, 14:49    [18429645]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
o-o
Guest
Чип&Дейл
Чтобы админы могли из приложения менять права а не на сервере

"копать отсюда и до обеда"???
где ж это админы собрались права-то менять, если не на сервере?
вы читаете, что вообще вам пишут?
та процедура -- ископаемый ящер,
она не показывает даже права на схемы.
а система может быть вся построена на этом:
каждой виндовой группе даны права на ее схему и все.
17 ноя 15, 14:51    [18429660]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
o-o
Чип&Дейл
Чтобы админы могли из приложения менять права а не на сервере

"копать отсюда и до обеда"???
где ж это админы собрались права-то менять, если не на сервере?
вы читаете, что вообще вам пишут?
та процедура -- ископаемый ящер,
она не показывает даже права на схемы.
а система может быть вся построена на этом:
каждой виндовой группе даны права на ее схему и все.


тс хочет придумать лизопед
17 ноя 15, 14:54    [18429691]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Чего вы все докопались до человека
- зачем тебе это надо?
- а ты точно уверен что тебе именно ЭТО надо?
- пойди возьми лучше вот ТО, а то ЭТИМ можешь порезаться.....

Надо ему - пусть обернет и пользуется.

А если вдруг порежется - то может смело хаять форум и говорить, что это тут ему такой дрянной совет дали.
Этого мы что-ли все боимся?

Постоянно почти в каждой теме, на какой-нить пустяковый вопрос, вижу советы типа
"да у тебя база говно, выкинь ее на помойку и сделай все нормально, тогда таких вопросов не будет".
Как будто все живут в вакууме и никто никогда чужой говно_код не разгребал так чтобы не потонуть в нем.

Зачем такие советы?!!

(да просто создай процедуру с тем же набором/типами параметров и вызови из нее процедуры ТУ САМУЮ)

Каков вопрос таков и ответ.
Хотел гранату - получи.

Ну а по хорошему нужно вдумчиво посмотреть/почитать про системный вид sys.syspermissions.
17 ноя 15, 14:56    [18429711]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
Glory
Member

Откуда:
Сообщений: 104751
Jaffar
Надо ему - пусть обернет и пользуется.

Так он даже это сделать не может
17 ноя 15, 14:58    [18429727]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура  [new]
o-o
Guest
Glory
Так и непонятно, зачем для этого заменять системную процедуру на пользовательскую

у меня есть предположение по этому поводу.
выхлоп системных процедур он не смог на форме отобразить в прошлых темах типа:
Диалоговое окно.
видимо, кто-то подсказал не использовать системные,
а свою написать, чтобы выдавала результат в том виде, к-ый он сумеет отобразить.
только товарищ никак не понимает, что ему надо руками код написать, к-ый ему нужен,
а не сменить наименование процедуры, типа она уже не системная, а пользовательская.

а т.к. никто не знает, что вообще он способен в приложении отобразить,
то никто и помочь не в состоянии
17 ноя 15, 14:58    [18429728]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить