табличку из всех :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;
А чего не так? По идее так и должно быть
Правда, непонятно зачем делать через цикл. Чего сразу не выбрать как джойн lt_users и таблы бд?
lt_result надо как-то тип задать. В середине процедуры не даёт такое вставить: DECLARE lt_result LIKE :lt_priv;
Джоин с таблицей PUBLIC.EFFECTIVE_PRIVILEGES, к сожалению, нельзя. Безопасность и всё такое.
А че пишет в этом случае?
Добавляю DECLARE lt_res LIKE :lt_priv; Пишет: sql syntax error: incorrect syntax near "DECLARE"
Вот это ещё глянь: описать сперва табличной тип, а потом его юзать https://help.sap.com/docs/SAP_HANA_PLATFORM/de2486ee947e43e684d39702027f8a94/c4338e0143c14e46bf751437769cc81b.html?version=2.0.02&locale=en-US
Да, тоже про него читал, но как-то неудобно... В общем, вот через такой костыль, похоже, завелось: 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;
Императивная логика в sqlscript харам. Лучше тип объявить
Для типа нужны конкретные VARCHAR(сколько_то_символов). Не хотелось бы потом попасть на ошибку на несоответствие типов. А то эта процедура на разных версиях крутиться будет.
Преждевременная оптимизация as is, imho
И без имеративщины никак - 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
Что-то ошибка непонятна. У таблиц поля одного типа, по которым джойн? М. Б. Приводить надо?
Нота есть на это дело. Но с трубы не могу посмотреть, че они там пишут https://userapps.support.sap.com/sap/support/knowledge/en/2748386
Нет. Тип одинаковый. Просто так сделали, чтобы нельзя было получить, например, список всех пользователей у которых есть супер полномочия.
Пишут, что сделали это ради безопасности)
Про императив - я про иф имел ввиду
Мне всё же удобнее не определять промежуточные типы и ставить константы для VARCHAR(). Вместо VARCHAR пробовал TEXT, но с ним UNION не работает и ограничения для :itab.INSERT() есть.
Как я помню из документации, в этом случае паралеллилизьм отключится
а где про параллелизм написано? с for он работает?
Я так понимаю, тк фор тоже императив - нет
а, ну тогда ладно. спасибо!
Вот тут, в конце https://help.sap.com/docs/SAP_HANA_PLATFORM/de2486ee947e43e684d39702027f8a94/d7d9d79509224097905debb380334592.html?version=2.0.04&locale=en-US
Вообще, это в курсах на опенсап было. В самом первом по разработке под хану. Thomas jung читал
А так это не переписывается: lt_priv = SELECT * FROM PUBLIC.EFFECTIVE_PRIVILEGES WHERE user_name IN ( SELECT user_name FROM PUBLIC.users ); ?
Перезаписывается. Но результат складывается в lt_res = SELECT * FROM :lt_res UNION SELECT * FROM :lt_priv; https://t.me/sapabap/136478
А, сорри, не так прочитал. Попробовал - IN, = ANY не работают. Только = подходит.
Можно перед циклом "объявить" lt_res выбором в нее пустой записи (типа where user_name = ''), а в цикле уже union, без всяких if
Да, тоже вариант, но тогда надо будет снова повторять список полей при выборке и для :lt_priv и для :lt_res. Ну и дополнительная реальная выборка появляется для :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 Везде обложили.
Обсуждают сегодня