Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Права пользователя и запуск хранимой процедуры / 15 сообщений из 15, страница 1 из 1
01.02.2021, 11:04
    #40040404
3akapym
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Права пользователя и запуск хранимой процедуры
Всем здравствуйте!
Прошу сильно не кидаться какахами, по форуму порыскал, но в голове не сложилось картинки как решить мою проблему.
В sql умею только пожалуй на уровне запросов, а сейчас вот приходится погружаться глубже...
Суть проблемы:
Есть хранимая процедура, которую я запускаю через ssms, запуская его от имени доменного пользователя windows, аутентификация по входу в вин соответственно. Процедура внутри ссылается на другие, в том числе и на системные sp_addlinkedserver и тд.
Для остальных операций в базе используется авторизация через логин пароль, которой я пользуюсь в том числе и программно в Python, но при попытке запуска этой процедуры вылетает следующее:

OLE DB provider "MSOLAP" for linked server "D9A60797-B376-40F1-8D98-FA6BC8F2C248" returned message "Произошла ошибка на уровне транспорта.".
OLE DB provider "MSOLAP" for linked server "D9A60797-B376-40F1-8D98-FA6BC8F2C248" returned message "Узел преждевременно завершил подключение.".
Msg 7303, Level 16, State 1, Line 3
Cannot initialize the data source object of OLE DB provider "MSOLAP" for linked server "D9A60797-B376-40F1-8D98-FA6BC8F2C248"


Как то можно победить эту проблему и в python запускать эту процедуру? Я думаю точно можно, но не совсем понимаю, что мне нужно для этого сделать... Можно какими-то широкими мазками обозначит путь решения этой проблемы) Скрипт, который должен это запускать, крутится на сервере linux (возможно, это тоже важно).
Спасибо заранее за помощь и уделённое время!
...
Рейтинг: 0 / 0
01.02.2021, 12:12
    #40040426
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Права пользователя и запуск хранимой процедуры
3akapym,

Почему используете драйвер для olap? Как выглядит скрипт pt из которого запускается процедура?
...
Рейтинг: 0 / 0
01.02.2021, 13:12
    #40040462
3akapym
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Права пользователя и запуск хранимой процедуры
felix_ff,

1. Насколько я понимаю, результаты работы процедуры затем доступны из excel, возможно поэтому и драйвер... Но я опять же не совсем понимаю, как это все устроено, может быть неправильно понял. Процедуру данную писал не я, я занимаюсь тем, что заполняю нужные для ее работы таблицы из различных источников. И вот надо бы сделать так, чтобы эту процедуру с некоторыми параметрами запускали пользователи, для которых все это разрабатывается, через кнопочку на нашей инфосистеме, а не дергали меня для запуска как сейчас, sql они не владеют от слова совсем))
2. Скрипт в python я пока не писал, лишь пробовал запускать процедуру из ssms от этих же логина и пароля, которые использую в python для работы. Думаю, примерно будет выглядеть это все вот так:
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
# подключение к базе
cnxn =db_connection()
cursor = cnxn.cursor()
query ="""USE <имя базы>
GO
DECLARE	@return_value int
EXEC	@return_value = <имя процедуры> <параметры>
SELECT	'Return Value' = @return_value"""
cursor.execute(query)
cursor.commit()
...
Рейтинг: 0 / 0
01.02.2021, 15:01
    #40040518
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Права пользователя и запуск хранимой процедуры
3akapym,

Если судить по ошибке 7303:
У вас хранимка имеет код который пытается писать информацию на удаленный сервер (в данном случае excel файл).
Если у вас линк-сервер создается внутри хранимки то параметры создания - "в студию".
...
Рейтинг: 0 / 0
02.02.2021, 10:30
    #40040794
3akapym
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Права пользователя и запуск хранимой процедуры
felix_ff, спасибо за ответы)
Внутри основной процедуры запускается другая, которая как я понимаю и вылетает с ошибкой, код привожу:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
ALTER procedure [dbo].[processOLAPdb] @srv nvarchar(100), @db nvarchar(100)
as
begin
	declare @servername varchar(255)
	set @servername = convert(varchar(255), newid())
	exec sp_addlinkedserver @server= @servername, 
		@provider='MSOLAP', @srvproduct='', @datasrc=@srv, @catalog=@db;
	exec sp_serveroption @servername, 'rpc out', true;
	exec(
		'exec(''{"refresh": {"type": "full","objects": [{"database": "' + @db + '"}]}}'') at [' +
		@servername + '];');
	exec sp_dropserver @servername;
end
...
Рейтинг: 0 / 0
02.02.2021, 15:53
    #40040918
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Права пользователя и запуск хранимой процедуры
3akapym,

первое: что прилетает в параметр @srv к этой процедуре на момент вызова?

второе: какая то очень странная конструкция запроса после этого улетает на линкованный сервер
Код: sql
1.
exec('{"refresh": {"type": "full","objects": [{"database": "база"}]}}') at [какойто гуид];
...
Рейтинг: 0 / 0
02.02.2021, 20:21
    #40040981
Grim08
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Права пользователя и запуск хранимой процедуры
felix_ff
3akapym,

первое: что прилетает в параметр @srv к этой процедуре на момент вызова?

второе: какая то очень странная конструкция запроса после этого улетает на линкованный сервер
Код: sql
1.
exec('{"refresh": {"type": "full","objects": [{"database": "база"}]}}') at [какойто гуид];


Этот код запускает полное обновление OLAP куба на прилинкованной машине. Но походу в коде ошибка, попробуйте вот так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
ALTER PROCEDURE [dbo].[processOLAPdb] @srv NVARCHAR(100), @db NVARCHAR(100)
AS
BEGIN	
	EXEC sp_addlinkedserver
		@server = N'SSAS', 
		@provider=N'MSOLAP',
		@srvproduct=N'',
		@datasrc=@srv,
		@catalog=@db;
	--Если понадобиться то введите имя пользователя и пароль, который создан в кубе
	--EXEC sp_addlinkedsrvlogin @rmtsrvname = N'SSAS ', @useself = N'False', @locallogin = NULL, @rmtuser = USER, @rmtpassword = PASSWORD
	EXEC sp_serveroption @server=N'SSAS', @optname=N'rpc', @optvalue=N'true';
	EXEC sp_serveroption @server=N'SSAS', @optname=N'rpc out',  @optvalue=N'true';	
	EXEC('{"refresh": {"type": "full","objects": [{"database": "' + @db + '"}]}}') AT SSAS;
	EXEC sp_dropserver N'SSAS';
END;


И проверьте есть ли права на базу данных master у учетки выполняющей запрос. В крайнем случае добавьте в код
Код: sql
1.
WITH EXECUTE AS OWNER
...
Рейтинг: 0 / 0
03.02.2021, 10:39
    #40041063
3akapym
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Права пользователя и запуск хранимой процедуры
felix_ff
3akapym,

первое: что прилетает в параметр @srv к этой процедуре на момент вызова?

второе: какая то очень странная конструкция запроса после этого улетает на линкованный сервер
Код: sql
1.
exec('{"refresh": {"type": "full","objects": [{"database": "база"}]}}') at [какойто гуид];


@srv - имя сервера, на котором хранится и процедура и все данные

По поводу второго вообще не могу ничего сказать, в этом колдунстве я не разбираюсь. Похоже на js


Grim08, я ради эксперимента пересоздал основную процедуру (не ту, которую вы предлагаете модифицировать,а внешнюю), добавив туда
Код: sql
1.
WITH EXECUTE AS OWNER


При ее запуске теперь вылетает следующее

(1 row affected)
Msg 15247, Level 16, State 1, Procedure sys.sp_MSaddserver_internal, Line 34 [Batch Start Line 2]
User does not have permission to perform this action.
Msg 15247, Level 16, State 1, Procedure sp_serveroption, Line 27 [Batch Start Line 2]
User does not have permission to perform this action.
Msg 7202, Level 11, State 2, Line 3
Could not find server '4D7AEC10-23E7-4310-8F6A-D635A585E5DE' in sys.servers. Verify that the correct server name was specified. If necessary, execute the stored procedure sp_addlinkedserver to add the server to sys.servers.
Msg 15247, Level 16, State 1, Procedure sp_dropserver, Line 20 [Batch Start Line 2]
User does not have permission to perform this action.
Msg 15274, Level 16, State 1, Line 3
Access to the remote server is denied because the current security context is not trusted.
...
Рейтинг: 0 / 0
03.02.2021, 15:08
    #40041194
Grim08
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Права пользователя и запуск хранимой процедуры
3akapym,
Простите, не подумал и вас запутал. Владельце вашей процедуры является схема "dbo" в базе данных, но для создания linked server нужны права на уровне сервера, поэтому использовать
Код: sql
1.
WITH EXECUTE AS OWNER

не получится.
Вот этот код запускает процессинг OLAP куба:
Код: sql
1.
exec('{"refresh": {"type": "full","objects": [{"database": "база"}]}}') at [какойто гуид];


Ошибка в том что пользователь который запускает данный код не имеет доступ к OLAP кубу. Также учтите что подключение к службам SSAS можно только под Windows Autentification другого не дано.
Для решения вашей проблемы или для тестирования можете добавить пользователя, который имеет доступ после команды создания linked server
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
EXEC sp_addlinkedserver
		@server = N'SSAS', 
		@provider=N'MSOLAP',
		@srvproduct=N'',
		@datasrc=@srv,
		@catalog=@db;
	--Если понадобиться то введите имя пользователя и пароль, который создан в кубе
	EXEC sp_addlinkedsrvlogin @rmtsrvname = N'SSAS ', @useself = N'False', @locallogin = NULL, @rmtuser = N'СЮДА ИМЯ', @rmtpassword = N'СЮДА ПАРОЛЬ'


Но лучше получите доступ для того пользователя, который запускает эту процедуру
...
Рейтинг: 0 / 0
03.02.2021, 15:17
    #40041209
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Права пользователя и запуск хранимой процедуры
3akapym,

все догнал, я думал что вы линк сервер создаете к excel файлику, а у вас там подключение к SSAS;

WITH EXECUTE AS OWNER в данном случае использовать нельзя потому что контекст запуска будет EXECUTE AS USER и вам не хватит прав уровня сервера для создания динамического линкед сервера.


а вообще для начала надо проверить вообще тот хост на котором у вас кубы живой вообще?
проходят ли ICMP, открыт ли порт 2383?

что выдает команда?
setspn -L <имя сервера OLAP>

если живой то можете для начала явно вручную создать линк на OLAP сервер без процедуры, и протестировать свой запрос, а уже потом разбираться с динамическим созданием.
...
Рейтинг: 0 / 0
03.02.2021, 15:49
    #40041238
Grim08
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Права пользователя и запуск хранимой процедуры
Честно я бы не стал использовать такой подход.
1. Полный процессинг куба может быть временно затратным
2. В процедуре предусмотрен механизм создания нескольких прилинкованных серверов, поэтому там и ГУИД и динамически запрос, но запустить 2 процессинга куба не получится. Поэтому лучше уж создать прилинкованный именованный сервер.
3. Странно что процессинг происходит из внешних приложений по запросу, лучше подумать про процессинг ежедневный или часовой все зависит от потребности, но чтобы данные были готовы к их использованию
...
Рейтинг: 0 / 0
03.02.2021, 16:22
    #40041261
3akapym
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Права пользователя и запуск хранимой процедуры
Grim08

Ошибка в том что пользователь который запускает данный код не имеет доступ к OLAP кубу. Также учтите что подключение к службам SSAS можно только под Windows Autentification другого не дано.
Для решения вашей проблемы или для тестирования можете добавить пользователя, который имеет доступ после команды создания linked server
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
EXEC sp_addlinkedserver
		@server = N'SSAS', 
		@provider=N'MSOLAP',
		@srvproduct=N'',
		@datasrc=@srv,
		@catalog=@db;
	--Если понадобиться то введите имя пользователя и пароль, который создан в кубе
	EXEC sp_addlinkedsrvlogin @rmtsrvname = N'SSAS ', @useself = N'False', @locallogin = NULL, @rmtuser = N'СЮДА ИМЯ', @rmtpassword = N'СЮДА ПАРОЛЬ'


Но лучше получите доступ для того пользователя, который запускает эту процедуру

Да я покопался и понял, что создать сервер пользователь может а вот выполнить команду внутри нет)
Я правильно понимаю, что команда обновления куба не выполнится без windows authentication? Можно ли как то это реализовать посредством консольных утилит в linux? Без питона, просто сбацать bash-скрипт, который запустит то, что нужно...
В прошлый мой заход к этой проблеме, я научился делать этой командой из винды:
runas /netonly /user: <юзер> "sqlcmd -S <сервер> -d <база>"
Вот думаю может что то подобное можно провернуть и на сервере...
Дело в том, что этот расчет в кубе, должен проводиться, когда данные для него все собраны. А это делается частично вручную и не по времени, поэтому автоматический запуск здесь неуместен: нужно каким-то образом сделать возможность запуска извне в любое время.
...
Рейтинг: 0 / 0
03.02.2021, 16:28
    #40041265
Grim08
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Права пользователя и запуск хранимой процедуры
Я думаю ваш подход имеет место быть, только учтите что для подключения под определенным пользователем должна быть виндовая авторизация.
Я не знаю зачем такой сложный процесс, но может проще создать джоб обновления и выдать учетке агента доступ в куб, а потом уже при помощи T-SQL дергать джобу?
...
Рейтинг: 0 / 0
04.02.2021, 09:09
    #40041432
3akapym
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Права пользователя и запуск хранимой процедуры
Grim08
Я думаю ваш подход имеет место быть, только учтите что для подключения под определенным пользователем должна быть виндовая авторизация.
Я не знаю зачем такой сложный процесс, но может проще создать джоб обновления и выдать учетке агента доступ в куб, а потом уже при помощи T-SQL дергать джобу?


Кажется, такой способ пробовал мой коллега: создавал джобу под виндовой авторизацией, и потом пытался ее дергать под рабочей учеткой без win_auth, и как бы нифига... Или нужно дать этой второй рабочей учетке доступ в куб?
...
Рейтинг: 0 / 0
05.02.2021, 14:00
    #40042115
Grim08
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Права пользователя и запуск хранимой процедуры
Конечно, учетка под которой выполняется джоб должна иметь соответствующие права для выполнения своих действий, в том числе в кубе.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Права пользователя и запуск хранимой процедуры / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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