Мне нужно удалить (прочитать/обновить) некоторые значения в некоторых таблицах и хотеть использовать хранимую процедуру для уменьшения проблем безопасности.Хранимая процедура SQL Server: динамически удалять запись
Поскольку таблиц много, а записи еще больше, и нет смысла писать хранимую процедуру для каждой комбинации, и, поскольку у всех есть такая потребность, я думал, что было бы легко найти хранимую процедуру для этого. но много гуглинга я не нашел простого и короткого ответа, поэтому я попытался создать свою собственную хранимую процедуру. Но я боюсь, что это может иметь некоторые проблемы с безопасностью: в основном, когда я объявляю @Table
как nvarchar(30)
.. Я попытался объявить как ТАБЛИЦУ, но он возвращает ошибку.
Может подсказать, что не приемлемо и предложить решение?
Благодаря
Здесь хранимая процедура для удаления .. но для других действий может быть аналогичен:
CREATE PROCEDURE dbo.spDeleteRecord
(
@UID nvarchar(20) = NOT NULL,
@PWD nvarchar(30) = NOT NULL,
@Table sysname,
@WhereField sysname,
@WhereValue nvarchar(150) = NOT NULL
)
AS
SET NOCOUNT ON;
DECLARE @S nvarchar(max) = '',
@P nvarchar(max) = ''
SET @S = 'DELETE t
from dbo.'+quotename(@Table)+' t
join dbo.subUsers su on t.UID = su.UID
where ' + quotename(@WhereField) + ' = @_WhereValue
and su.SUID = @_UID
and su.PWD = @_PWD'
SET @P = '@_UID nvarchar(50),
@_PWD nvarchar(50),
@_Table sysname,
@_WhereField sysname,
@_WhereValue nvarchar(150)'
--PRINT @S
EXEC sp_executesql @S, @P, @UID, @PWD, @Table, @WhereField, @WhereValue
SET NOCOUNT OFF
Спасибо за чтение Джо
динамический proc для удаления строк ... что может пойти не так! –
Зачем этот код? Почему бы не использовать 'CASCADE DELETE' в внешних ключах или TRIGGER, который удаляет связанные записи? Это не только проблемы * безопасности *. Если вы не вызываете * все *, удаляет внутри одной процедуры, у вас будут записи зомби. Почему бы не написать * одну хранимую процедуру для удаления всех связанных записей? Вы даже можете использовать генерацию кода для создания операторов удаления –
, но это простые таблицы без связанных записей. В основном это таблица, содержащая имя пользователя, активировавшего определенную услугу , и пользователь может изменить свою собственную подписку. в любом случае .. никогда не использовал 'CASCADE DELETE', но он может быть полезен в другой ситуации. Спасибо за совет. – Joe