169 похожих чатов

А есть здесь гуру HANA SQLScript? Мне нужно сделать итоговую (UNION)

табличку из всех :lt_priv и никак не могу придумать как их соединить:
Create Or Replace Procedure "GET_HANA_SPECIAL_PRIVILEGES"()
Language SQLScript
SQL Security Invoker
Reads SQL Data
as
Begin
DECLARE lv_count INT;
DECLARE lv_i INT;
DECLARE lv_user_name VARCHAR(100);

lt_users = SELECT user_name
FROM PUBLIC.users;

select count(*) into lv_count from :lt_users;

for lv_i in 1..lv_count do
lv_user_name = :lt_users.user_name[lv_i];
lt_priv =
SELECT user_name, privilege, grantee, grantee_type, grantor, grantor_type,
object_type, schema_name, object_name, column_name, is_grantable, is_valid
FROM PUBLIC.EFFECTIVE_PRIVILEGES
WHERE user_name = :lv_user_name;
-- вот здесь хочу сделать что-то типа lt_result = SELECT * FROM :lt_priv UNION SELECT * FROM :lt_result;
end for;
End;

30 ответов

53 просмотра

А чего не так? По идее так и должно быть

Правда, непонятно зачем делать через цикл. Чего сразу не выбрать как джойн lt_users и таблы бд?

Iurii-Slobodchikov Автор вопроса
Денис
А чего не так? По идее так и должно быть

lt_result надо как-то тип задать. В середине процедуры не даёт такое вставить: DECLARE lt_result LIKE :lt_priv;

Iurii-Slobodchikov Автор вопроса
Денис
Правда, непонятно зачем делать через цикл. Чего ср...

Джоин с таблицей PUBLIC.EFFECTIVE_PRIVILEGES, к сожалению, нельзя. Безопасность и всё такое.

Iurii-Slobodchikov Автор вопроса
Денис
А че пишет в этом случае?

Добавляю DECLARE lt_res LIKE :lt_priv; Пишет: sql syntax error: incorrect syntax near "DECLARE"

Iurii Slobodchikov
Добавляю DECLARE lt_res LIKE :lt_priv; Пишет: sql ...

Вот это ещё глянь: описать сперва табличной тип, а потом его юзать https://help.sap.com/docs/SAP_HANA_PLATFORM/de2486ee947e43e684d39702027f8a94/c4338e0143c14e46bf751437769cc81b.html?version=2.0.02&locale=en-US

Iurii-Slobodchikov Автор вопроса
Денис
Вот это ещё глянь: описать сперва табличной тип, а...

Да, тоже про него читал, но как-то неудобно... В общем, вот через такой костыль, похоже, завелось: if :lv_i = 1 THEN lt_res = SELECT * FROM :lt_priv; else lt_res = SELECT * FROM :lt_res UNION SELECT * FROM :lt_priv; end if;

Iurii Slobodchikov
Да, тоже про него читал, но как-то неудобно... В о...

Императивная логика в sqlscript харам. Лучше тип объявить

Iurii-Slobodchikov Автор вопроса
Денис
Императивная логика в sqlscript харам. Лучше тип о...

Для типа нужны конкретные VARCHAR(сколько_то_символов). Не хотелось бы потом попасть на ошибку на несоответствие типов. А то эта процедура на разных версиях крутиться будет.

Iurii-Slobodchikov Автор вопроса
Денис
Императивная логика в sqlscript харам. Лучше тип о...

И без имеративщины никак - JOIN нельзя использовать с PUBLIC.EFFECTIVE_PRIVILEGES: SELECT * FROM PUBLIC.users JOIN PUBLIC.EFFECTIVE_PRIVILEGES ON PUBLIC.users.user_name = PUBLIC.EFFECTIVE_PRIVILEGES.user_name Could not execute 'SELECT * FROM PUBLIC.users JOIN PUBLIC.EFFECTIVE_PRIVILEGES ON PUBLIC.users.user_name = ...' in 209 ms 709 µs . SAP DBTech JDBC: [500]: predicates are required in a where clause: M_EFFECTIVE_PRIVILEGES_ needs predicates on columns (connected by AND if more than one): an equal predicate on USER_NAME

Iurii Slobodchikov
И без имеративщины никак - JOIN нельзя использоват...

Что-то ошибка непонятна. У таблиц поля одного типа, по которым джойн? М. Б. Приводить надо?

Iurii Slobodchikov
И без имеративщины никак - JOIN нельзя использоват...

Нота есть на это дело. Но с трубы не могу посмотреть, че они там пишут https://userapps.support.sap.com/sap/support/knowledge/en/2748386

Iurii-Slobodchikov Автор вопроса
Денис
Что-то ошибка непонятна. У таблиц поля одного типа...

Нет. Тип одинаковый. Просто так сделали, чтобы нельзя было получить, например, список всех пользователей у которых есть супер полномочия.

Iurii-Slobodchikov Автор вопроса
Денис
Нота есть на это дело. Но с трубы не могу посмотре...

Пишут, что сделали это ради безопасности)

Iurii-Slobodchikov Автор вопроса
Денис
Про императив - я про иф имел ввиду

Мне всё же удобнее не определять промежуточные типы и ставить константы для VARCHAR(). Вместо VARCHAR пробовал TEXT, но с ним UNION не работает и ограничения для :itab.INSERT() есть.

Iurii Slobodchikov
Мне всё же удобнее не определять промежуточные тип...

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

Iurii-Slobodchikov Автор вопроса
Денис
Как я помню из документации, в этом случае паралел...

а где про параллелизм написано? с for он работает?

Iurii Slobodchikov
а где про параллелизм написано? с for он работает?

Я так понимаю, тк фор тоже императив - нет

Iurii-Slobodchikov Автор вопроса
Iurii Slobodchikov
а где про параллелизм написано? с for он работает?

Вот тут, в конце https://help.sap.com/docs/SAP_HANA_PLATFORM/de2486ee947e43e684d39702027f8a94/d7d9d79509224097905debb380334592.html?version=2.0.04&locale=en-US

Iurii Slobodchikov
а где про параллелизм написано? с for он работает?

Вообще, это в курсах на опенсап было. В самом первом по разработке под хану. Thomas jung читал

Iurii Slobodchikov
Нет. Тип одинаковый. Просто так сделали, чтобы нел...

А так это не переписывается: lt_priv = SELECT * FROM PUBLIC.EFFECTIVE_PRIVILEGES WHERE user_name IN ( SELECT user_name FROM PUBLIC.users ); ?

Iurii-Slobodchikov Автор вопроса
Alexandr Zhuravlev
А так это не переписывается: lt_priv = S...

Перезаписывается. Но результат складывается в lt_res = SELECT * FROM :lt_res UNION SELECT * FROM :lt_priv; https://t.me/sapabap/136478

Iurii-Slobodchikov Автор вопроса
Alexandr Zhuravlev
А так это не переписывается: lt_priv = S...

А, сорри, не так прочитал. Попробовал - IN, = ANY не работают. Только = подходит.

Iurii Slobodchikov
Да, тоже про него читал, но как-то неудобно... В о...

Можно перед циклом "объявить" lt_res выбором в нее пустой записи (типа where user_name = ''), а в цикле уже union, без всяких if

Iurii-Slobodchikov Автор вопроса
Andrey
Можно перед циклом "объявить" lt_res выбором в нее...

Да, тоже вариант, но тогда надо будет снова повторять список полей при выборке и для :lt_priv и для :lt_res. Ну и дополнительная реальная выборка появляется для :lt_res)

Iurii-Slobodchikov Автор вопроса
Andrey
Можно перед циклом "объявить" lt_res выбором в нее...

Ещё не получается неправильных пользователей запрашивать: SAP DBTech JDBC: [500]: predicates are required in a where clause: user_name must be specified SAP DBTech JDBC: [500]: predicates are required in a where clause: unknown user_name Везде обложили.

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта