|
табличная функция
|
|||
---|---|---|---|
#18+
Добрый день, уважаемые ! Помогите пожалуйста написать функцию (MS SQL), возвращающую таблицу, имя которой задано в параметрах (@table), отфильтрованную по @id ALTER FUNCTION fun_test (@id INT, @table NVARCHAR(10)) RETURNS TABLE AS RETURN ( SELECT * FROM @table WHERE Ответственный = @id ) GO Ругается на @table, что мол тип не табличный... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2021, 13:58 |
|
табличная функция
|
|||
---|---|---|---|
#18+
Чтобы использовать имя таблицы в запросе, надо делать динамический sql. Но динамический sql в функциях запрещен. Какая цель этой функции? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2021, 14:08 |
|
табличная функция
|
|||
---|---|---|---|
#18+
Megabyte, Цель функции, унифицировать фильтрацию во всех таблицах по доступу пользователя. Грубо говоря во всех таблицах, доступных пользователям, есть поле "ответственный", содержащее id пользователя, которым доступна запись. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2021, 14:13 |
|
табличная функция
|
|||
---|---|---|---|
#18+
drgdr Megabyte, Цель функции, унифицировать фильтрацию во всех таблицах по доступу пользователя. Грубо говоря во всех таблицах, доступных пользователям, есть поле "ответственный", содержащее id пользователя, которым доступна запись. Ну если так хочется, делайте хранимую процедуру вместо табличной функции с динамическим sql. Но вообще это имхо изврат. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2021, 14:19 |
|
табличная функция
|
|||
---|---|---|---|
#18+
Megabyte drgdr Megabyte, Цель функции, унифицировать фильтрацию во всех таблицах по доступу пользователя. Грубо говоря во всех таблицах, доступных пользователям, есть поле "ответственный", содержащее id пользователя, которым доступна запись. Ну если так хочется, делайте хранимую процедуру вместо табличной функции с динамическим sql. Но вообще это имхо изврат. ну, да... или вот так, вопреки категоричному совету прдыдущего юзера Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2021, 14:31 |
|
табличная функция
|
|||
---|---|---|---|
#18+
Ролг Хупин, спасибо за пример, но у меня таблиц хоть и немного, но структура у них разная. как я понял, в этом случае придется для каждой таблицы свою функцию делать, что кажется нивелирует плюсы функции... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2021, 14:54 |
|
табличная функция
|
|||
---|---|---|---|
#18+
drgdr Ролг Хупин, спасибо за пример, но у меня таблиц хоть и немного, но структура у них разная. как я понял, в этом случае придется для каждой таблицы свою функцию делать, что кажется нивелирует плюсы функции... плюсы функции? для меня у функций больше минусов, чем плюсов. Выше вам написали, что для того, чтобы сделать "универсальную" функцию, вам надо сделать динамический запрос внутри и т.д. Оно вам надо? Если да - думайте, как красиво мутонуть, и что это вам даст ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2021, 15:13 |
|
табличная функция
|
|||
---|---|---|---|
#18+
drgdr, так на T-SQL не пишут. Это не объектный язык, для начала изучите парадигму декларативного языка и реляционных баз, потом думайте, как вести разработку. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2021, 18:01 |
|
табличная функция
|
|||
---|---|---|---|
#18+
drgdr Ролг Хупин, спасибо за пример, но у меня таблиц хоть и немного, но структура у них разная. как я понял, в этом случае придется для каждой таблицы свою функцию делать, что кажется нивелирует плюсы функции... Раз небольшое к-во таблиц...на крайняк вы можете всунуть в функцию параметром имя или целое и в зависимости от значения выпонять какой-то запрос. Но производительность будет низкой ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2021, 18:20 |
|
табличная функция
|
|||
---|---|---|---|
#18+
Давайте на секунду представим, что оно как-то работало бы. Объясните мне, чем Код: sql 1.
лучше, чем Код: sql 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2021, 18:24 |
|
табличная функция
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич, в этом случае конечно такой изврат ни к чему, но у меня посложнее запрос, который будет часто вызываться. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2021, 21:24 |
|
табличная функция
|
|||
---|---|---|---|
#18+
drgdr Цель функции, унифицировать фильтрацию во всех таблицах по доступу пользователя. Грубо говоря во всех таблицах, доступных пользователям, есть поле "ответственный", содержащее id пользователя, которым доступна запись. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2021, 21:52 |
|
табличная функция
|
|||
---|---|---|---|
#18+
invm drgdr Цель функции, унифицировать фильтрацию во всех таблицах по доступу пользователя. Грубо говоря во всех таблицах, доступных пользователям, есть поле "ответственный", содержащее id пользователя, которым доступна запись. А если все цепляются к базе под "sa" (упокой его душу...) ? PS Вариант: когда все ломятся на веб-морду, а вебморда смотрит на базу под локальным админом и только передаёт в него имяЮзера обратившегося к ней (к вебморде тоесть) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2021, 22:39 |
|
табличная функция
|
|||
---|---|---|---|
#18+
drgdr Добрый день, уважаемые ! Помогите пожалуйста написать функцию (MS SQL), возвращающую таблицу, имя которой задано в параметрах (@table), отфильтрованную по @id ALTER FUNCTION fun_test (@id INT, @table NVARCHAR(10)) RETURNS TABLE AS RETURN ( SELECT * FROM @table WHERE Ответственный = @id ) GO Ругается на @table, что мол тип не табличный... невзлетит. Да и не нужно. Пишите по отдельной функции для каждой таблицы (если очень неймётся делать функции). Можете даже обойтись представлениями (view) - просто селектить данные из него, если сможете авторизовываться на SQL-сервере под нужным логином (правда, тогда Вам больше подойдёт решение от invm ,- см. выше) . Либо пишите по отдельной процедуре (процедуру можно и одну на всех, но лучше так не надо). Процедуры нормально отдают результат в приложения (например на C# работает нормально,- сам использую самописное подобие вебморды, которое забирает данные из скуля). PS Есличо,- могу где-то ошибаться. Путь знающие товарищи поправят ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2021, 22:49 |
|
табличная функция
|
|||
---|---|---|---|
#18+
drgdr Гавриленко Сергей Алексеевич, в этом случае конечно такой изврат ни к чему, но у меня посложнее запрос, который будет часто вызываться. Очевидно, что у Вас неверная архитектура хранения данных, если приходится прибегать к таким запросам. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2021, 00:26 |
|
табличная функция
|
|||
---|---|---|---|
#18+
SIMPLicity_ А если все цепляются к базе под "sa" ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2021, 09:55 |
|
табличная функция
|
|||
---|---|---|---|
#18+
SIMPLicity_ invm пропущено... Все уже давно придумано до вас - https://docs.microsoft.com/ru-ru/sql/relational-databases/security/row-level-security?view=sql-server-ver15 А если все цепляются к базе под "sa" (упокой его душу...) ? PS Вариант: когда все ломятся на веб-морду, а вебморда смотрит на базу под локальным админом и только передаёт в него имяЮзера обратившегося к ней (к вебморде тоесть) расшифруйте этот пассаж для чяйников: почему там про душу "sa" в таком ключе? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2021, 11:33 |
|
табличная функция
|
|||
---|---|---|---|
#18+
Полагал что "фильтрованная выдача" нужна для конечного приложения, которым пользуются конечные клиенты. Часто бывает, что конечные клиенты логинятся в сервер все под одним логином (sa, например) наплевав на роли и безопасность. Или бывает, что запросы идут на вебморду, а вебморда сама обращается в базу через одного пользователя. В статье все примеры начинаются с "трёх пользователе". Я так понял. PS С сокрытием колонок та же ситуация. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2021, 15:12 |
|
табличная функция
|
|||
---|---|---|---|
#18+
SIMPLicity_, А в статье разве утверждается, что фильтрующая функция должна оперировать исключительно пользователями БД? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2021, 15:34 |
|
табличная функция
|
|||
---|---|---|---|
#18+
invm SIMPLicity_, А в статье разве утверждается, что фильтрующая функция должна оперировать исключительно пользователями БД? "Безопасность на уровне строк позволяет использовать членство в группе или контекст выполнения для управления доступом к строкам в таблице базы данных." и В. Сценарий для пользователей, подключающихся к базе данных через приложение среднего уровня .... Приложение задает идентификатор пользователя текущего приложения в SESSION_CONTEXT (Transact-SQL) после подключения к базе данных, а затем политики безопасности прозрачно фильтруют строки, которые не должны быть видимыми для данного идентификатора, а также запрещают пользователю вставлять строки для другого ИД пользователя. Остальное - в общем-то подобное. Мне кажется. Но спасибо за зерно сомнения!,- может быть как-нибудь перечитаю внимательнее... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2021, 16:13 |
|
|
start [/forum/topic.php?fid=46&gotonew=1&tid=1684941]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
65ms |
get topic data: |
8ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 10ms |
total: | 164ms |
0 / 0 |