C# 以编程方式扫描整个数据库

C# 以编程方式扫描整个数据库,c#,sql-server,database,tsql,database-scan,C#,Sql Server,Database,Tsql,Database Scan,我最近继承了一组非常大的SQL Server数据库。应用程序和数据库模式一团糟。我在数据库中遇到了几个存储不同类型敏感数据的字段,这些敏感数据不应该存储在这些字段中。由于我的数据库中有近10000个表,我迫切需要一种方法,以编程方式扫描其中一些数据库,找出数据所在的位置。我意识到这将是非常资源密集型的,所以我专门设置了一个服务器来运行数据库备份扫描 我也没有钱买任何工具 有人知道使用C和SQL可以扫描数据库中所有用户表以查找敏感数据的方法吗 扫描一种类型的数据(如SSN)的示例将非常有用。我相信

我最近继承了一组非常大的SQL Server数据库。应用程序和数据库模式一团糟。我在数据库中遇到了几个存储不同类型敏感数据的字段,这些敏感数据不应该存储在这些字段中。由于我的数据库中有近10000个表,我迫切需要一种方法,以编程方式扫描其中一些数据库,找出数据所在的位置。我意识到这将是非常资源密集型的,所以我专门设置了一个服务器来运行数据库备份扫描

我也没有钱买任何工具

有人知道使用C和SQL可以扫描数据库中所有用户表以查找敏感数据的方法吗


扫描一种类型的数据(如SSN)的示例将非常有用。我相信我可以将其外推到我需要的所有场景中。

此sql将列出数据库中的所有用户表和行计数。这将是一个起点

SELECT o.name,
  ddps.row_count 
FROM sys.indexes AS i
  INNER JOIN sys.objects AS o ON i.OBJECT_ID = o.OBJECT_ID
  INNER JOIN sys.dm_db_partition_stats AS ddps ON i.OBJECT_ID = ddps.OBJECT_ID
  AND i.index_id = ddps.index_id 
WHERE i.index_id < 2  AND o.is_ms_shipped = 0 ORDER BY o.NAME 
嗯,,
O

此查询将帮助您查找具有特定名称和数据类型的列

SELECT t.name AS table_name,
    SCHEMA_NAME(t.schema_id) AS schema_name,
    c.name AS column_name ,tp.name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
INNER JOIN sys.types tp ON tp.user_type_id=c.user_type_id
WHERE c.name LIKE '%Product%' AND tp.name LIKE '%int%'
ORDER BY schema_name, table_name;

此时,这可能与此无关,但应作为一个补充说明:您可以使用信息模式视图来查询符合ISO标准定义的数据库对象


如果可以将数据库打开到MicrosoftSQLServerManagementStudio中,则可以尝试使用ApexSQL。这是一个插件,可以从这里下载:

例如:选择数据库,可以查找列名。它将显示包含该列的所有表。
希望能有所帮助。

如果我理解您的问题,您是在使用特定数据类型的表中查找列名?在SSE上也有类似的问题,我想这就是您需要的。该工具能够在不同的数据库中找到PII。谢谢,我将研究它,但它是Perl的。具有讽刺意味的是,我的公司在我们的系统中有一项反对Perl的政策。