Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / табличная функция / 20 сообщений из 20, страница 1 из 1
16.03.2021, 13:58
    #40054002
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, что мол тип не табличный...
...
Рейтинг: 0 / 0
16.03.2021, 14:08
    #40054013
Megabyte
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
табличная функция
Чтобы использовать имя таблицы в запросе, надо делать динамический sql. Но динамический sql в функциях запрещен.

Какая цель этой функции?
...
Рейтинг: 0 / 0
16.03.2021, 14:13
    #40054022
drgdr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
табличная функция
Megabyte,

Цель функции, унифицировать фильтрацию во всех таблицах по доступу пользователя.
Грубо говоря во всех таблицах, доступных пользователям, есть поле "ответственный", содержащее id пользователя, которым доступна запись.
...
Рейтинг: 0 / 0
16.03.2021, 14:19
    #40054028
Megabyte
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
табличная функция
drgdr
Megabyte,

Цель функции, унифицировать фильтрацию во всех таблицах по доступу пользователя.
Грубо говоря во всех таблицах, доступных пользователям, есть поле "ответственный", содержащее id пользователя, которым доступна запись.


Ну если так хочется, делайте хранимую процедуру вместо табличной функции с динамическим sql. Но вообще это имхо изврат.
...
Рейтинг: 0 / 0
16.03.2021, 14:31
    #40054034
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
табличная функция
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.
CREATE FUNCTION udfContacts()
    RETURNS @contacts TABLE (
        first_name VARCHAR(50),
        last_name VARCHAR(50),
        email VARCHAR(255),
        phone VARCHAR(25),
        contact_type VARCHAR(20)
    )
AS
BEGIN
    INSERT INTO @contacts
    SELECT 
        first_name, 
        last_name, 
        email, 
        phone,
        'Staff'
    FROM
        sales.staffs;

    INSERT INTO @contacts
    SELECT 
        first_name, 
        last_name, 
        email, 
        phone,
        'Customer'
    FROM
        sales.customers;
    RETURN;
END;
GO
SELECT 
    * 
FROM
    udfContacts();
GO
...
Рейтинг: 0 / 0
16.03.2021, 14:54
    #40054051
drgdr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
табличная функция
Ролг Хупин,

спасибо за пример, но у меня таблиц хоть и немного, но структура у них разная.
как я понял, в этом случае придется для каждой таблицы свою функцию делать, что кажется нивелирует плюсы функции...
...
Рейтинг: 0 / 0
16.03.2021, 15:13
    #40054063
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
табличная функция
drgdr
Ролг Хупин,

спасибо за пример, но у меня таблиц хоть и немного, но структура у них разная.
как я понял, в этом случае придется для каждой таблицы свою функцию делать, что кажется нивелирует плюсы функции...


плюсы функции? для меня у функций больше минусов, чем плюсов.
Выше вам написали, что для того, чтобы сделать "универсальную" функцию, вам надо сделать динамический запрос внутри и т.д.
Оно вам надо?
Если да - думайте, как красиво мутонуть, и что это вам даст
...
Рейтинг: 0 / 0
16.03.2021, 18:01
    #40054230
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
табличная функция
drgdr,

так на T-SQL не пишут. Это не объектный язык, для начала изучите парадигму декларативного языка и реляционных баз, потом думайте, как вести разработку.
...
Рейтинг: 0 / 0
16.03.2021, 18:20
    #40054245
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
табличная функция
drgdr
Ролг Хупин,

спасибо за пример, но у меня таблиц хоть и немного, но структура у них разная.
как я понял, в этом случае придется для каждой таблицы свою функцию делать, что кажется нивелирует плюсы функции...


Раз небольшое к-во таблиц...на крайняк вы можете всунуть в функцию параметром имя или целое и в зависимости от значения выпонять какой-то запрос. Но производительность будет низкой
...
Рейтинг: 0 / 0
16.03.2021, 18:24
    #40054248
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
табличная функция
Давайте на секунду представим, что оно как-то работало бы.

Объясните мне, чем

Код: sql
1.
select * from dbo.fun_test (10, 'MyTable') a



лучше, чем

Код: sql
1.
select * from [MyTable] where Ответственный = 10



?
...
Рейтинг: 0 / 0
16.03.2021, 21:24
    #40054312
drgdr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
табличная функция
Гавриленко Сергей Алексеевич,

в этом случае конечно такой изврат ни к чему, но у меня посложнее запрос, который будет часто вызываться.
...
Рейтинг: 0 / 0
16.03.2021, 21:52
    #40054330
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
табличная функция
drgdr
Цель функции, унифицировать фильтрацию во всех таблицах по доступу пользователя.
Грубо говоря во всех таблицах, доступных пользователям, есть поле "ответственный", содержащее id пользователя, которым доступна запись.
Все уже давно придумано до вас - https://docs.microsoft.com/ru-ru/sql/relational-databases/security/row-level-security?view=sql-server-ver15
...
Рейтинг: 0 / 0
16.03.2021, 22:39
    #40054355
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
табличная функция
invm
drgdr
Цель функции, унифицировать фильтрацию во всех таблицах по доступу пользователя.
Грубо говоря во всех таблицах, доступных пользователям, есть поле "ответственный", содержащее id пользователя, которым доступна запись.
Все уже давно придумано до вас - https://docs.microsoft.com/ru-ru/sql/relational-databases/security/row-level-security?view=sql-server-ver15


А если все цепляются к базе под "sa" (упокой его душу...) ?

PS Вариант: когда все ломятся на веб-морду, а вебморда смотрит на базу под локальным админом и только передаёт в него имяЮзера обратившегося к ней (к вебморде тоесть)
...
Рейтинг: 0 / 0
16.03.2021, 22:49
    #40054359
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
табличная функция
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 Есличо,- могу где-то ошибаться. Путь знающие товарищи поправят ;)
...
Рейтинг: 0 / 0
17.03.2021, 00:26
    #40054388
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
табличная функция
drgdr
Гавриленко Сергей Алексеевич,

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


Очевидно, что у Вас неверная архитектура хранения данных, если приходится прибегать к таким запросам.
...
Рейтинг: 0 / 0
17.03.2021, 09:55
    #40054446
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
табличная функция
SIMPLicity_
А если все цепляются к базе под "sa"
Может, для начала, стоит статью полностью прочитать?
...
Рейтинг: 0 / 0
17.03.2021, 11:33
    #40054489
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
табличная функция
SIMPLicity_
invm
пропущено...
Все уже давно придумано до вас - https://docs.microsoft.com/ru-ru/sql/relational-databases/security/row-level-security?view=sql-server-ver15


А если все цепляются к базе под "sa" (упокой его душу...) ?

PS Вариант: когда все ломятся на веб-морду, а вебморда смотрит на базу под локальным админом и только передаёт в него имяЮзера обратившегося к ней (к вебморде тоесть)


расшифруйте этот пассаж для чяйников: почему там про душу "sa" в таком ключе?
...
Рейтинг: 0 / 0
17.03.2021, 15:12
    #40054605
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
табличная функция
Полагал что "фильтрованная выдача" нужна для конечного приложения, которым пользуются конечные клиенты.
Часто бывает, что конечные клиенты логинятся в сервер все под одним логином (sa, например) наплевав на роли и безопасность.
Или бывает, что запросы идут на вебморду, а вебморда сама обращается в базу через одного пользователя.

В статье все примеры начинаются с "трёх пользователе". Я так понял.
PS С сокрытием колонок та же ситуация.
...
Рейтинг: 0 / 0
17.03.2021, 15:34
    #40054622
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
табличная функция
SIMPLicity_,

А в статье разве утверждается, что фильтрующая функция должна оперировать исключительно пользователями БД?
...
Рейтинг: 0 / 0
17.03.2021, 16:13
    #40054636
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
табличная функция
invm
SIMPLicity_,

А в статье разве утверждается, что фильтрующая функция должна оперировать исключительно пользователями БД?


"Безопасность на уровне строк позволяет использовать членство в группе или контекст выполнения для управления доступом к строкам в таблице базы данных."

и

В. Сценарий для пользователей, подключающихся к базе данных через приложение среднего уровня
.... Приложение задает идентификатор пользователя текущего приложения в SESSION_CONTEXT (Transact-SQL) после подключения к базе данных, а затем политики безопасности прозрачно фильтруют строки, которые не должны быть видимыми для данного идентификатора, а также запрещают пользователю вставлять строки для другого ИД пользователя.


Остальное - в общем-то подобное. Мне кажется.
Но спасибо за зерно сомнения!,- может быть как-нибудь перечитаю внимательнее...
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / табличная функция / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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