|
so kann man alle datenbanken, alle tabellen und dateien nach einer zeichenfolge durchsuchen:
$search = 'gesuchte Zeichenfolge'
$path = 'D:\'
Get-ChildItem -Path $path -Recurse -File -ErrorAction SilentlyContinue |
Where-Object { $_.Extension -in '.config','.xml','.ini','.json','.txt','.cfg','.conf','.properties','.yaml','.yml','.bat','.cmd','.ps1' } |
Select-String -Pattern $search -SimpleMatch |
Select-Object Path, LineNumber, Line
SET NOCOUNT ON;
DECLARE @Search NVARCHAR(4000) = N'gesuchte Zeichenfolge';
DECLARE @Pattern NVARCHAR(4000) = N'%' + @Search + N'%';
IF OBJECT_ID('tempdb..#Columns') IS NOT NULL DROP TABLE #Columns;
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results;
IF OBJECT_ID('tempdb..#Errors') IS NOT NULL DROP TABLE #Errors;
CREATE TABLE #Columns
(
DatabaseName SYSNAME,
SchemaName SYSNAME,
TableName SYSNAME,
ColumnName SYSNAME,
DataType SYSNAME
);
CREATE TABLE #Results
(
DatabaseName SYSNAME,
SchemaName SYSNAME,
TableName SYSNAME,
ColumnName SYSNAME,
MatchCount BIGINT
);
CREATE TABLE #Errors
(
DatabaseName SYSNAME NULL,
SchemaName SYSNAME NULL,
TableName SYSNAME NULL,
ColumnName SYSNAME NULL,
ErrorMessage NVARCHAR(4000)
);
DECLARE @Db SYSNAME;
DECLARE @Sql NVARCHAR(MAX);
--------------------------------------------------------------------------------
-- 1) Alle durchsuchbaren Spalten aus allen User-Datenbanken sammeln
--------------------------------------------------------------------------------
DECLARE db_cursor CURSOR LOCAL FAST_FORWARD FOR
SELECT name
FROM sys.databases
WHERE state_desc = 'ONLINE'
AND database_id > 4
AND source_database_id IS NULL;
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @Db;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Sql = N'
USE ' + QUOTENAME(@Db) + N';
INSERT INTO #Columns (DatabaseName, SchemaName, TableName, ColumnName, DataType)
SELECT
DB_NAME(),
s.name,
t.name,
c.name,
ty.name
FROM sys.tables t
INNER JOIN sys.schemas s
ON s.schema_id = t.schema_id
INNER JOIN sys.columns c
ON c.object_id = t.object_id
INNER JOIN sys.types ty
ON ty.user_type_id = c.user_type_id
WHERE t.is_ms_shipped = 0
AND c.is_computed = 0
AND ty.name IN (N''char'', N''varchar'', N''nchar'', N''nvarchar'', N''text'', N''ntext'', N''xml'');';
BEGIN TRY
EXEC (@Sql);
END TRY
BEGIN CATCH
INSERT INTO #Errors (DatabaseName, ErrorMessage)
VALUES (@Db, ERROR_MESSAGE());
END CATCH;
FETCH NEXT FROM db_cursor INTO @Db;
END
CLOSE db_cursor;
DEALLOCATE db_cursor;
--------------------------------------------------------------------------------
-- 2) Jede gefundene Spalte durchsuchen
--------------------------------------------------------------------------------
DECLARE
@Schema SYSNAME,
@Table SYSNAME,
@Column SYSNAME,
@DataType SYSNAME,
@MatchCount BIGINT;
DECLARE col_cursor CURSOR LOCAL FAST_FORWARD FOR
SELECT DatabaseName, SchemaName, TableName, ColumnName, DataType
FROM #Columns
ORDER BY DatabaseName, SchemaName, TableName, ColumnName;
OPEN col_cursor;
FETCH NEXT FROM col_cursor INTO @Db, @Schema, @Table, @Column, @DataType;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Sql = N'
SELECT @MatchCountOUT = COUNT_BIG(*)
FROM ' + QUOTENAME(@Db) + N'.' + QUOTENAME(@Schema) + N'.' + QUOTENAME(@Table) + N' WITH (NOLOCK)
WHERE CONVERT(NVARCHAR(4000), ' + QUOTENAME(@Column) + N') LIKE @Pattern;';
BEGIN TRY
SET @MatchCount = 0;
EXEC sp_executesql
@Sql,
N'@Pattern NVARCHAR(4000), @MatchCountOUT BIGINT OUTPUT',
@Pattern = @Pattern,
@MatchCountOUT = @MatchCount OUTPUT;
IF @MatchCount > 0
BEGIN
INSERT INTO #Results (DatabaseName, SchemaName, TableName, ColumnName, MatchCount)
VALUES (@Db, @Schema, @Table, @Column, @MatchCount);
END
END TRY
BEGIN CATCH
INSERT INTO #Errors (DatabaseName, SchemaName, TableName, ColumnName, ErrorMessage)
VALUES (@Db, @Schema, @Table, @Column, ERROR_MESSAGE());
END CATCH;
FETCH NEXT FROM col_cursor INTO @Db, @Schema, @Table, @Column, @DataType;
END
CLOSE col_cursor;
DEALLOCATE col_cursor;
--------------------------------------------------------------------------------
-- 3) Treffer
--------------------------------------------------------------------------------
SELECT
DatabaseName,
SchemaName,
TableName,
ColumnName,
MatchCount
FROM #Results
ORDER BY MatchCount DESC, DatabaseName, SchemaName, TableName, ColumnName;
--------------------------------------------------------------------------------
-- 4) Fehler
--------------------------------------------------------------------------------
SELECT *
FROM #Errors
ORDER BY DatabaseName, SchemaName, TableName, ColumnName;
(hier muss evtl. eine fehlerhafte spalte aus dem script entfernt werden)
|