Хранимые процедуры SQL Server - обновить столбец на основе имени переменной ..? - PullRequest
0 голосов
/ 24 мая 2010

У меня есть управляемый данными сайт со множеством хранимых процедур.В конечном итоге я хочу сказать что-то вроде:

For Each @variable in sproc inputs
    UPDATE @TableName SET @variable.toString = @variable
Next

Я бы хотел, чтобы он мог принимать любое количество аргументов.

В основном он будет проходить через всевходных данных и обновите столбец с именем переменной со значением переменной - например, столбец «Имя» будет обновлен значением @Name.Я хотел бы в основном иметь одну хранимую процедуру для обновления и одну для создания.Однако для этого мне понадобится преобразовать фактическое имя переменной, а не ее значение, в строку.

Вопрос 1: Возможно ли это сделать в T-SQL, и если да, токак?

Вопрос 2: Существуют ли какие-либо серьезные недостатки использования чего-либо подобного (например, производительность или загрузка ЦП)?

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

Заранее большое спасибо,

С уважением,

Ричард Кларк

Редактировать:

Я знаю об использовании строк SQL и о рискеАтаки SQL-инъекциями - я немного изучил это в своей диссертации несколько недель назад.

В основном, веб-сайт использует объектно-ориентированную архитектуру.Есть много классов - например, Product - которые имеют много «Атрибутов» (я создал свой собственный класс с именем Attribute, у которого есть такие свойства, как DataField, Name и Value, где DataField используется для получения или обновления данных. Имя отображается в администрации.внешний интерфейс при создании или обновлении продукта, а значение, которое может отображаться в клиентском интерфейсе, устанавливается администратором. DataField - это поле, которое я буду использовать в «ОБНОВЛЕНИИ Blah SET @Field = @Value».

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

В основном структура настроенатак что ни один пользователь не сможет изменить значение DataField или Name, но он может изменить значение. Я думаю, что если бы я использовал динамически параметризованные строки SQL, то не было бы риска атак SQL-инъекций.

Я имею в виду в основном цикл через все атрибуты, так чтоэто заканчивается как:

UPDATE Products SET [Name] = '@Name', Description = '@Description', Display = @Display

Затем снова переберите все атрибуты и добавьте значения параметров - это будет иметь тот же эффект, что и использование хранимых процедур, верно?

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

Ответы [ 3 ]

2 голосов
/ 24 мая 2010

Ваш пример очень неэффективен, поэтому, если я укажу 10 столбцов, вы обновите одну и ту же таблицу 10 раз?

Лучше всего сделать одно обновление с помощью sp_executesql и построить его динамически, посмотрите на Проклятие и благословения динамического SQL , чтобы увидеть, как это сделать

2 голосов
/ 24 мая 2010

Вопрос 1: вы должны использовать динамический SQL - создайте свой оператор обновления как строку и запустите его с помощью команды EXEC.

Вопрос 2: да, есть - атаки с использованием SQL-инъекций, риск неправильногозапросы, добавленные накладные расходы при необходимости компилировать отдельный оператор SQL.

0 голосов
/ 26 мая 2010

Является ли это новой системой, в которой у вас есть свобода проектирования по мере необходимости, или вы застряли с существующим дизайном БД?

Можно рассмотреть представление атрибутов не в виде столбцов, а в виде строк в дочернем элементе.table.

В родительском MyObject у вас будут данные уровня заголовка, общие для всех объектов в системе (может быть, просто идентификатор).В дочерней таблице MyObjectAttribute у вас будет первичный ключ с другим столбцом attrValue.Таким образом, вы можете сделать ОБНОВЛЕНИЕ следующим образом:

UPDATE MyObjectAttribute 
    SET attrValue = @myValue
    WHERE objectID = @myID
    AND attrName = @myAttrName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...