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

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

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

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


Ну если так хочется, делайте хранимую процедуру вместо табличной функции с динамическим sql. Но вообще это имхо изврат.
...
Рейтинг: 0 / 0
табличная функция
    #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
табличная функция
    #40054051
drgdr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин,

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

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


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

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

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


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

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

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



лучше, чем

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



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

в этом случае конечно такой изврат ни к чему, но у меня посложнее запрос, который будет часто вызываться.
...
Рейтинг: 0 / 0
табличная функция
    #40054330
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drgdr
Цель функции, унифицировать фильтрацию во всех таблицах по доступу пользователя.
Грубо говоря во всех таблицах, доступных пользователям, есть поле "ответственный", содержащее id пользователя, которым доступна запись.
Все уже давно придумано до вас - https://docs.microsoft.com/ru-ru/sql/relational-databases/security/row-level-security?view=sql-server-ver15
...
Рейтинг: 0 / 0
табличная функция
    #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
табличная функция
    #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
табличная функция
    #40054388
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drgdr
Гавриленко Сергей Алексеевич,

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


Очевидно, что у Вас неверная архитектура хранения данных, если приходится прибегать к таким запросам.
...
Рейтинг: 0 / 0
табличная функция
    #40054446
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_
А если все цепляются к базе под "sa"
Может, для начала, стоит статью полностью прочитать?
...
Рейтинг: 0 / 0
табличная функция
    #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
табличная функция
    #40054605
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полагал что "фильтрованная выдача" нужна для конечного приложения, которым пользуются конечные клиенты.
Часто бывает, что конечные клиенты логинятся в сервер все под одним логином (sa, например) наплевав на роли и безопасность.
Или бывает, что запросы идут на вебморду, а вебморда сама обращается в базу через одного пользователя.

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

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

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


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

и

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


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


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