powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Права пользователя и запуск хранимой процедуры
15 сообщений из 15, страница 1 из 1
Права пользователя и запуск хранимой процедуры
    #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
Права пользователя и запуск хранимой процедуры
    #40040426
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3akapym,

Почему используете драйвер для olap? Как выглядит скрипт pt из которого запускается процедура?
...
Рейтинг: 0 / 0
Права пользователя и запуск хранимой процедуры
    #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
Права пользователя и запуск хранимой процедуры
    #40040518
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3akapym,

Если судить по ошибке 7303:
У вас хранимка имеет код который пытается писать информацию на удаленный сервер (в данном случае excel файл).
Если у вас линк-сервер создается внутри хранимки то параметры создания - "в студию".
...
Рейтинг: 0 / 0
Права пользователя и запуск хранимой процедуры
    #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
Права пользователя и запуск хранимой процедуры
    #40040918
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3akapym,

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

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

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

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


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

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

если живой то можете для начала явно вручную создать линк на OLAP сервер без процедуры, и протестировать свой запрос, а уже потом разбираться с динамическим созданием.
...
Рейтинг: 0 / 0
Права пользователя и запуск хранимой процедуры
    #40041238
Grim08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Честно я бы не стал использовать такой подход.
1. Полный процессинг куба может быть временно затратным
2. В процедуре предусмотрен механизм создания нескольких прилинкованных серверов, поэтому там и ГУИД и динамически запрос, но запустить 2 процессинга куба не получится. Поэтому лучше уж создать прилинкованный именованный сервер.
3. Странно что процессинг происходит из внешних приложений по запросу, лучше подумать про процессинг ежедневный или часовой все зависит от потребности, но чтобы данные были готовы к их использованию
...
Рейтинг: 0 / 0
Права пользователя и запуск хранимой процедуры
    #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
Права пользователя и запуск хранимой процедуры
    #40041265
Grim08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я думаю ваш подход имеет место быть, только учтите что для подключения под определенным пользователем должна быть виндовая авторизация.
Я не знаю зачем такой сложный процесс, но может проще создать джоб обновления и выдать учетке агента доступ в куб, а потом уже при помощи T-SQL дергать джобу?
...
Рейтинг: 0 / 0
Права пользователя и запуск хранимой процедуры
    #40041432
3akapym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Grim08
Я думаю ваш подход имеет место быть, только учтите что для подключения под определенным пользователем должна быть виндовая авторизация.
Я не знаю зачем такой сложный процесс, но может проще создать джоб обновления и выдать учетке агента доступ в куб, а потом уже при помощи T-SQL дергать джобу?


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


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