Skip to content

Instantly share code, notes, and snippets.

View ghotz's full-sized avatar

Gianluca Hotz ghotz

View GitHub Profile
@ghotz
ghotz / evaluate-jobowner.sql
Created May 8, 2024 16:21
Evaluate and fix job owners
SELECT
J1.[name] AS job_name
, C1.[name] AS category_name, S1.[name] as [owner_name]
, CASE
WHEN S1.[name] = N'sa' OR S1.[name] LIKE '##%'
THEN NULL
ELSE 'EXEC msdb..sp_update_job @job_name = ''' + J1.[name] + ''''
+ ', @owner_login_name = ''sa'' -- was ' + QUOTENAME(S1.[name])
END AS alter_command
FROM msdb.dbo.sysjobs AS J1
@ghotz
ghotz / evaluate-db-owner.sql
Created May 8, 2024 16:01
Evaluate and fix non sa database owner
SELECT
D1.[name] AS database_name, S1.[name] as [owner_name]
, CASE
WHEN S1.[name] = N'sa'
THEN NULL
--ELSE 'ALTER AUTHORIZATION ON DATABASE::' + QUOTENAME(D1.[name]) + ' TO [sa] -- was ' + QUOTENAME(S1.[name])
ELSE 'USE ' + QUOTENAME(D1.[name]) + '; EXEC sp_changedbowner ''sa'' -- was ' + QUOTENAME(S1.[name])
END AS alter_command
FROM sys.databases AS D1
LEFT
@ghotz
ghotz / evaluate-non-trusted-constraints.sql
Created May 8, 2024 10:49
Evaluate and fix non trusted constraint
SELECT
QUOTENAME(S1.[name]) AS [schema_name]
, QUOTENAME(O1.[name]) AS [table_name]
, QUOTENAME(C1.[name]) AS [constraint_name]
, N'FOREIGN_KEY_CONSTRAINT' AS [constraint_type]
, 'ALTER TABLE ' + QUOTENAME(S1.[name]) + '.' + QUOTENAME(O1.[name])
+ ' WITH CHECK CHECK CONSTRAINT ' + QUOTENAME(C1.[name]) AS sql_stmt
FROM sys.foreign_keys AS C1
JOIN sys.objects AS O1 ON C1.parent_object_id = O1.[object_id]
JOIN sys.schemas AS S1 ON O1.[schema_id] = S1.[schema_id]
@ghotz
ghotz / evluate-page-verify.sql
Created May 8, 2024 10:05
Evaluate and standardize page verify
SELECT
[name] AS database_name, page_verify_option_desc
, CASE
WHEN page_verify_option_desc = N'CHECKSUM'
THEN NULL
ELSE 'ALTER DATABASE [' + [name] + ']'
+ ' SET PAGE_VERIFY CHECKSUM;'
END AS alter_command
FROM sys.databases
WHERE [name] NOT IN ('master','model','msdb','tempdb')
@ghotz
ghotz / evaluate-recovery-time.sql
Created May 8, 2024 10:01
Evaluate and standardize database recovery time
SELECT
[name] AS database_name, target_recovery_time_in_seconds
, CASE
WHEN target_recovery_time_in_seconds = 60
THEN NULL
ELSE 'ALTER DATABASE [' + [name] + ']'
+ ' SET TARGET_RECOVERY_TIME = 60 SECONDS;'
END AS alter_command
FROM sys.databases
WHERE [name] NOT IN ('master','model','msdb','tempdb')
@ghotz
ghotz / view-ag-listener-details.sql
Created May 8, 2024 08:06
Various Availability Groups metadata queries
SELECT AG1.[name] AS ag_name
, AL1.dns_name AS ag_listener_dns_name
, AL1.[port] AS ag_listener_tcp_port
, AL2.ip_address AS ag_listener_ip_address
, AL2.ip_subnet_mask AS ag_listener_ip_subnet_mask
FROM sys.availability_groups AS AG1
JOIN sys.availability_group_listeners AS AL1
ON AG1.group_id = AL1.group_id
JOIN sys.availability_group_listener_ip_addresses AS AL2
ON AL1.listener_id = AL2.listener_id
@ghotz
ghotz / auto-deny.ps1
Last active May 7, 2024 04:40
Auto ban IP addresses by POST requests total size over a certain threshold in the last http log file
# Warning: remember to whitelist who you want to allow to post by entering their IP addresses in the Azure Portal
import-module Az;
$TenantID = 'YOURTENANTID';
$SubscriptionID = 'YOURSUBID'
$ResourceGroupName = 'WebSite';
$AppServiceName = 'YOURSERVICENAME';
$MyIP = (Invoke-WebRequest -uri "http://ifconfig.me/ip").Content; #avoid self-banning
$MaxPostsBytes = 100KB;
# Authenticate to Azure if not already authenticated
@ghotz
ghotz / get-top-by-bytes-in.ps1
Created May 3, 2024 04:50
Analyze Azure App Service Log Files in Kudu Console
$MyIp = 'xxx.xxx.xxx.xxx';
$Log = Get-Content "C:\home\logfiles\http\rawlogs\*.log" | Select -Skip 2 | ConvertFrom-Csv -Delimiter " " -Header 'date','time','s-sitename','cs-method','cs-uri-stem','cs-uri-query','s-port,cs-username','c-ip','cs(User-Agent)','cs(Cookie)','cs(Referer)','cs-host','sc-status','sc-substatus','sc-win32-status','sc-bytes','cs-bytes','time-taken';
$Log | ? { $_.'cs-method' -eq 'POST' -and $_.'cs(User-Agent)' -ne $MyIp } | Group-object -Property 'cs(User-Agent)' | % {[pscustomobject]@{Type=$_.Name;'Total POSTs'=$_.Count;'Total Bytes ↓' = ($_.group | measure-object 'cs-bytes' -Sum).Sum}} | Sort-Object 'Total Bytes ↓' -Descending | Select -first 10 | ft;
@ghotz
ghotz / get-http-rawlogs-top-offenders.ps1
Created April 22, 2024 12:00
Get top 10 offenders IP for total POSTS count and bytes from http logfiles
$Log = Get-Content "C:\home\logfiles\http\rawlogs\*.log" | Select -Skip 2 | ConvertFrom-Csv -Delimiter " " -Header 'date','time','s-sitename','cs-method','cs-uri-stem','cs-uri-query','s-port,cs-username','c-ip','cs(User-Agent)','cs(Cookie)','cs(Referer)','cs-host','sc-status','sc-substatus','sc-win32-status','sc-bytes','cs-bytes','time-taken';
$Log | ? { $_.'cs-method' -eq 'POST' } | Group-object -Property 'cs(User-Agent)' | % {[pscustomobject]@{Type=$_.Name;'Total POSTs ↓'=$_.Count;'Total Bytes' = ($_.group | measure-object 'cs-bytes' -Sum).Sum}} | Sort-Object 'Total POSTs ↓' -Descending | Select -first 10 | ft
$Log | ? { $_.'cs-method' -eq 'POST' } | Group-object -Property 'cs(User-Agent)' | % {[pscustomobject]@{Type=$_.Name;'Total POSTs'=$_.Count;'Total Bytes ↓' = ($_.group | measure-object 'cs-bytes' -Sum).Sum}} | Sort-Object 'Total Bytes ↓' -Descending | Select -first 10 | ft
@ghotz
ghotz / get-space-multiple-tables.sql
Last active February 13, 2024 11:04
Get tables/indexes space usage
-- based on https://stackoverflow.com/questions/7892334/get-size-of-all-tables-in-database/64037173#64037173
DECLARE @tables TABLE (table_name sysname primary key);
INSERT @tables VALUES ('schemaname.tablename'), ('schemaname.tablename')
SELECT
[object_id] = t.[object_id]
,[schema_name] = s.[name]
,[table_name] = t.[name]
,[index_name] = CASE WHEN i.[type] in (0,1,5) THEN null ELSE i.[name] END -- 0=Heap; 1=Clustered; 5=Clustered Columnstore
,[object_type] = CASE WHEN i.[type] in (0,1,5) THEN 'TABLE' ELSE 'INDEX' END