繁体   English   中英

SQL Server –在存储过程中使用动态查询提取用户数据

SQL Server – pulling user data using dynamic query in stored procedure

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有问题,我无法使用存储过程查看用户信息。 该过程接受三个参数: tablecolumnsearchBySomething 每次我想使用其他列搜索用户时,column变量都会接收ID的列,而searchBySomething变量会接收特定的id,该过程是可行的,但是当我发送另一列时,我会收到错误消息

无效的列名(数据)

该过程如下所示:

ALTER PROCEDURE [dbo].[userDetailsDisplay] 
    @table NVARCHAR(30),
    @column NVARCHAR(30),
    @searchBySomething NVARCHAR(30)

    DECLARE @sql NVARCHAR(100)

    SET @sql = 'SELECT * FROM ' + @table + ' WHERE ' + @column + ' = ' + @searchBySomething 
    EXECUTE sp_executesql @sql
3 个回复

因此,您得到的特定错误是因为您没有检查输入以查看传递给@column的字符串是否确实存在。 您可以根据元数据目录视图sys.columns进行以下检查:

if not exists
(
    select 1
    from sys.columns
    where object_id = object_id(@table)
        and name = @column
)
begin
    raiserror('Column %s does not exist in table %t', 16, 1, @column, @table)
    return
end

但是,如果我不指出两件事,我将被忽略。

首先,这种动态表动态where子句模式是非常不好的做法。 如果是针对已经具有数据库访问权限的人员,则他们只需查询自己的表即可。 而且,如果是针对外部用户的,那么您基本上可以通过此过程为他们提供完整的数据库读取访问权限。 当然,在极少数情况下需要使用此模式,因此,如果您对使用动态sql设置得一无所知,那将引出我的下一个观点。

您编写的代码容易受到SQL注入攻击。 任何时候使用动态SQL时,都必须非常小心其构造方式。 说我输入了列名; drop database [admin]-- ; drop database [admin]--假设您有这样一个数据库,我可能会很乐意被执行,而您的数据库也会消失。

如何确保动态SQL的安全是一个复杂的话题,但是如果您想认真学习它,那可能是您可以找到的最好的文章之一。 http://www.sommarskog.se/dynamic_sql.html

通过参数化查询并在表和列上使用quotename() ,我将其修改为如下所示。 如果有人尝试进行注入攻击,这仍然会引发奇怪的错误,但是至少它不会实际执行他们的代码。

create procedure [dbo].[userDetailsDisplay] 
    @table nvarchar(30),
    @column nvarchar(30),
    @searchBySomething nvarchar(30)
as
begin
    declare 
        @sql nvarchar(max),
        @params nvarchar(1000)

    if not exists
    (
        select 1
        from sys.columns
        where object_id = object_id(@table)
            and name = @column
    )
    begin
        raiserror('Column %s does not exist in table %t', 16, 1, @column, @table)
        return
    end

    select @sql = '
        select * 
        from ' + quotename(@table) + ' WHERE ' + quotename(@column) + ' = @searchBySomething'

    execute sp_executesql 
        @stmt = @sql,
        @params = '@searchBySomething nvarchar(30)',
        @searchBySomething = @searchBySomething
end

只需检查以确保表中存在该列。

每个@table调用,检查@column变量是在该表中。

SET @sql = 'SELECT * FROM ' + @table + ' WHERE ' + @column + ' = ' +''' @searchBySomething +''''

例如: select * from table where column ='value'

1 在存储过程中使用动态SQL?

我正在C#应用程序中为MySQL创建存储过程。 该存储过程包含一些动态创建的SQL,用于删除索引(如果存在),然后[重新]创建它。 SQL代码在MySQL Workbench中可以正常工作,但是当我从C#应用程序运行它时,却遇到了MySQL异常。 这是存储过程代码(正如我在C#中所使用 ...

2013-08-16 10:38:11 1 745   c#/ mysql
2 在存储过程中使用动态SQL的约束

我读了一篇关于在存储过程中构建动态SQL的文章,这真的很好,该文章说: 当我们需要根据不同的搜索参数检索一组记录时,需要使用动态SQL 因此,我认为我们可以在需要通过不同搜索检索一些记录的每个项目中使用它,而使用Dynamic SQL则没有任何约束。 是真的吗 ...

3 在存储过程中使用动态SQL

我有一个存储过程,该存储过程将以下具有表名@percapHist变量作为参数。 它将保留类似于“ percaphist1408 ”的值。 我想计算表中的记录数,并将该值保存在变量中以备后用。 我现在尝试使用dynamic sql 。 该语句可以快速编译,但是运行时必须声明scalar ...

5 Teradata存储过程中使用条件的动态SQL

我试图在Teradata中创建一个用户友好的存储过程,该存储过程接受许多变量并根据输入输出结果表。 我在SQL Assistant(提供商版本14.0.0.0)中构建查询。 例如... 通话声明... 创建语句... 我想动态构建一个WHERE子句,该子句仅包括用户在其 ...

7 使用lua c API从表中提取用户数据

我使用lua c api循环表中的变量,像这样 lua脚本: 卢阿阿皮 我可以得到结果 0 1 2 3 然后我想将一些userdata objs放入表中,然后在c api中循环它们 lua脚本 卢阿阿皮 如何从表中提取用户数据? 请帮助我 ...

8 使用VBA从HP ALM中提取用户数据

我有一个与HP ALM交互的Excel文档,以获取测试执行状态和缺陷。 是否可以提取有关用户数据的信息? IE,拉出用户名而不是用户名。 ...

9 从Firebase提取用户数据?

目前,我正在以这种方式显示用户的联系人 如何仅显示与addedByUser列中具有相同电子邮件的用户? 当您创建新的联系人时,它将自动将您的电子邮件的值分配给addByUser。 因此,例如,如果我从帐户show@mycontact.com添加联系人,它将仅显示具有添加值的联系人。B ...

10 如何使用Firebase和Vuejs提取用户数据

我有一个名为Meetup App的项目,该项目取自youtube教程。 一切都按我预期的那样工作,但是由于这种方法,我遇到了问题。 我无法在代码下方的此处显示个人资料用户页面: 文件夹store / join / index.js 当他们登录我的Meetup应用程序时,例 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM