Get job name on fly

Rédigé par Sozezzo - - Aucun commentaire

Get Job name when you are executing job. This is useful when you need to make reference to the job being executed.

 


DECLARE @jobname sysname, @jobid uniqueidentifier

SELECT @jobname=b.name,@jobid=b.job_id 
FROM sys.dm_exec_sessions a,msdb.dbo.sysjobs b
WHERE a.session_id=@@spid
AND
(SUBSTRING(MASTER.dbo.FN_VARBINTOHEXSTR(CONVERT(VARBINARY(16), b.JOB_ID)),1,10)) = SUBSTRING(a.PROGRAM_NAME,30,10)
PRINT 'Job Name : ' + @jobname

 

Instead, you can Use Tokens in Job Steps.
https://docs.microsoft.com/en-us/sql/ssms/agent/use-tokens-in-job-steps


PRINT 'Job Name  : '+'$(ESCAPE_SQUOTE(JOBNAME))'
PRINT 'Step Name : '+'$(ESCAPE_SQUOTE(STEPNAME))'

 

List all table constraints (PK, UK, FK, Check and Default) in SQL Server

Rédigé par Sozezzo - - Aucun commentaire

 

Query lists all table (and view) constraints - primary keys, unique key constraints and indexes, foreign keys and check, default constraints, and isDisabled.

 

Columns

  • SchemaName
  • Name - table or view schema and name
  • object_type - object type:
    • Table
    • View
  • constraint_type - type of constraint:
    • Primary key
    • Unique key
    • Foregin key
    • Check constraint
    • Default constraint
  • constraint_name - name of constraint or index
  • details - details of this constraint:
    • Primary key - PK column(s)
    • Unique key - UK column(s)
    • Foregin key - parent table name
    • Check constraint - check definition
    • Default constraint - column name and default value definition
  • IsDisable – it is disabled or not.

 


SELECT SchemaName
     ,[Name]
     ,object_type
     ,constraint_type
     ,constraint_name
     ,details
     ,IsDisabled
FROM (
     -- Index
     SELECT SCHEMA_NAME(t.schema_id) AS SchemaName
         ,t.[name] AS [Name]
         ,CASE
             WHEN t.[type] = 'U'
                 THEN 'Table'
             WHEN t.[type] = 'V'
                 THEN 'View'
             END AS [object_type]
         ,CASE
             WHEN c.[type] = 'PK'
                 THEN 'Primary key'
             WHEN c.[type] = 'UQ'
                 THEN 'Unique constraint'
             WHEN i.[type] = 1
                 THEN 'Unique clustered index'
             WHEN i.type = 2
                 THEN 'Unique index'
             END AS constraint_type
         ,ISNULL(c.[name], i.[name]) AS constraint_name
         ,SUBSTRING(column_names, 1, LEN(column_names) - 1) AS [details]
         ,i.is_disabled AS IsDisabled
     FROM sys.objects t
     LEFT OUTER JOIN sys.indexes i ON t.object_id = i.object_id
     LEFT OUTER JOIN sys.key_constraints c ON i.object_id = c.parent_object_id
         AND i.index_id = c.unique_index_id
     CROSS APPLY (
         SELECT col.[name] + ', '
         FROM sys.index_columns ic
         INNER JOIN sys.columns col ON ic.object_id = col.object_id
             AND ic.column_id = col.column_id
         WHERE ic.object_id = t.object_id
             AND ic.index_id = i.index_id
         ORDER BY col.column_id
         FOR XML PATH('')
         ) D(column_names)
     WHERE is_unique = 1
         AND t.is_ms_shipped <> 1
    
     UNION ALL
    
     -- Foreign key
     SELECT SCHEMA_NAME(fk_tab.schema_id)
         ,fk_tab.NAME AS foreign_table
         ,'Table'
         ,'Foreign key'
         ,fk.NAME AS fk_constraint_name
         ,SCHEMA_NAME(pk_tab.schema_id) + '.' + pk_tab.NAME
         ,fk.is_disabled AS IsDisabled
     FROM sys.foreign_keys fk
     INNER JOIN sys.tables fk_tab ON fk_tab.object_id = fk.parent_object_id
     INNER JOIN sys.tables pk_tab ON pk_tab.object_id = fk.referenced_object_id
     INNER JOIN sys.foreign_key_columns fk_cols ON fk_cols.constraint_object_id = fk.object_id
    
     UNION ALL
    
     -- Check constraint
     SELECT SCHEMA_NAME(t.schema_id)
         ,t.[name]
         ,'Table'
         ,'Check constraint'
         ,con.[name] AS constraint_name
         ,con.[definition]
         ,con.is_disabled AS IsDisabled
     FROM sys.check_constraints con
     LEFT OUTER JOIN sys.objects t ON con.parent_object_id = t.object_id
     LEFT OUTER JOIN sys.all_columns col ON con.parent_column_id = col.column_id
         AND con.parent_object_id = col.object_id
    
     UNION ALL
    
     -- Default constraint
     SELECT SCHEMA_NAME(t.schema_id)
         ,t.[name]
         ,'Table'
         ,'Default constraint'
         ,con.[name]
         ,col.[name] + ' = ' + con.[definition]
         ,0 AS IsDisabled
     FROM sys.default_constraints con
     LEFT OUTER JOIN sys.objects t ON con.parent_object_id = t.object_id
     LEFT OUTER JOIN sys.all_columns col ON con.parent_column_id = col.column_id
         AND con.parent_object_id = col.object_id
     ) a
ORDER BY SchemaName
     ,[Name]
     ,constraint_type
     ,constraint_name;

 

 

Script to set nocheck on foreign key constaints


-- Script to set nocheck on foreign key constaints
DECLARE @SchemaName VARCHAR(250) = NULL; -- 'dbo';
DECLARE @TableName VARCHAR(250) = NULL;  -- 'Client';
DECLARE @IDKey INT;
DECLARE @SqlScript VARCHAR(max);

SET NOCOUNT ON;

DROP TABLE IF EXISTS #tb;

-- Foreign key
SELECT ROW_NUMBER() OVER(ORDER BY SCHEMA_NAME(fk_tab.schema_id), fk_tab.NAME) AS [IDKey],
        --SCHEMA_NAME(fk_tab.schema_id),
        --fk_tab.NAME AS foreign_table,
        --fk.NAME AS fk_constraint_name,
        --SCHEMA_NAME(pk_tab.schema_id) + '.' + pk_tab.NAME,
        --fk.is_disabled AS IsDisabled,
        'ALTER TABLE [' + SCHEMA_NAME(fk_tab.schema_id) + '].[' + fk_tab.NAME + '] NOCHECK CONSTRAINT ' + fk.NAME + ';' AS SqlScript
INTO #tb
FROM sys.foreign_keys fk
      INNER JOIN sys.tables fk_tab ON fk_tab.object_id = fk.parent_object_id
      INNER JOIN sys.tables pk_tab ON pk_tab.object_id = fk.referenced_object_id
      INNER JOIN sys.foreign_key_columns fk_cols ON fk_cols.constraint_object_id = fk.object_id
WHERE fk.is_disabled = 0
AND (@SchemaName IS NULL OR @SchemaName = SCHEMA_NAME(fk_tab.schema_id))
AND (@TableName IS NULL OR @TableName = fk_tab.NAME)
;

while ((SELECT COUNT(*) FROM #tb) > 0 )
BEGIN
     SELECT top 1 @IDKey=IDKey, @SqlScript = SqlScript FROM #tb ORDER BY IDKey;
     DELETE FROM #tb WHERE @IDKey=IDKey;
     PRINT @SqlScript;
     --EXEC(@SqlScript);
END;

SQL Script to send a file by FTP

Rédigé par Sozezzo - - Aucun commentaire

This Stored procedure send a file by FTP.

Check if SQL Agent has access to the file and FTP server.

The little trick is to create a file that will run. It can have conflicts easily because filename is always the same. Next version will be with random name. 

 

Use this code carefully, it is not 100% safe.


USE master;
 PRINT '-- Server name: '+@@servername

IF EXISTS (
         SELECT *
         FROM sysobjects
         WHERE id = object_id(N'[dbo].[sp_FtpSendFile]')
             AND OBJECTPROPERTY(id, N'IsProcedure') = 1
         )
     DROP PROCEDURE [dbo].[sp_FtpSendFile]
 GO

/************************************************************

Description : Send a file by FTP

 @FTPServer      The host name.    ftp.example.com
 @FTPUser        The username for the FTP site.
 @FTPPWD         The password for the FTP site.
 @FTPPath        The ftp subfolder within the FTP site to place the file. Make sure to use forward slashes and leave a trailing slash.
 @FTPFileName    (optional) The filename to write within FTP. Typically the same as the source file name.
 @FTPPASV        (optional) Use passive mode
 @SourcePath     The local path to the directory that contains the source file. Make sure to have a trailing slash. c:\MyLocalPath\
 @SourceFile     The local source file to ftp.
 @workdir        (optional) The working local directory. This is where the stored proc will temporarily write a command file containing the FTP commands it will execute. = %TEMP%

*************************************************************/
 CREATE PROCEDURE sp_FtpSendFile

     -- Remote
      @FTPServer VARCHAR(128)
     ,@FTPUser VARCHAR(128)
     ,@FTPPWD VARCHAR(128)
     ,@FTPPath VARCHAR(128)
     ,@FTPFileName VARCHAR(128) = NULL  -- (optional)
     ,@FTPPASV INT = 1                  -- (optional)

    -- Local
     ,@SourcePath VARCHAR(128)
     ,@SourceFile VARCHAR(128)
     ,@workdir VARCHAR(128) = '%TEMP%'  -- (optional)

    -- debug
     ,@debug int = 0                    -- (optional)

AS
 BEGIN

/*
     
 -- sandbox

DECLARE
      @FTPServer VARCHAR(128)
     ,@FTPUser VARCHAR(128) = ''
     ,@FTPPWD VARCHAR(128)
     ,@FTPPath VARCHAR(128)
     ,@FTPFileName VARCHAR(128) = NULL -- (optional)
     ,@FTPPASV INT = 1 -- (optional)
     ,@SourcePath VARCHAR(128)
     ,@SourceFile VARCHAR(128)
     ,@workdir VARCHAR(128) = '%TEMP%' -- (optional)
     ,@debug int = 0

SELECT
     @FTPServer = 'ftp.mysite.com' ,
     @FTPUser = 'myusername' ,
     @FTPPWD = 'mypassword' ,
     @FTPPath = '/' ,
     @SourcePath = 'K:\temp\Backup\' ,
     @SourceFile = 'myFile.bak' ,
     @debug = 0

*/

    SET nocount on
     DECLARE @cmd VARCHAR(1000)
     DECLARE @workfilename VARCHAR(128)
     DECLARE @noNull table (r NVARCHAR(MAX))

    SET @workfilename =  @workdir + 'ftpcmd.txt'

    -- deal with special characters for echo commands
     SET @FTPServer = replace(replace(replace(@FTPServer, '|', '^|'), '<', '^<'), '>', '^>')
     SET @FTPUser = replace(replace(replace(@FTPUser, '|', '^|'), '<', '^<'), '>', '^>')
     SET @FTPPWD = replace(replace(replace(@FTPPWD, '|', '^|'), '<', '^<'), '>', '^>')
     SET @FTPPath = replace(replace(replace(@FTPPath, '|', '^|'), '<', '^<'), '>', '^>')

    SET @cmd = 'echo open ' + @FTPServer + ' > ' + @workfilename
     INSERT @noNull EXEC master..xp_cmdshell @cmd

    SET @cmd = 'echo ' + @FTPUser + '>> ' + @workfilename
     INSERT @noNull EXEC master..xp_cmdshell @cmd

    SET @cmd = 'echo ' + @FTPPWD + '>> ' + @workfilename
     INSERT @noNull EXEC master..xp_cmdshell @cmd

    IF (@FTPPASV = 1)
     BEGIN
         SET @cmd = 'echo quote PASV >> ' + @workfilename
         INSERT @noNull EXEC master..xp_cmdshell @cmd
     END

    SET @cmd = 'echo cd '+ @FTPPath + '>> ' + @workfilename
     INSERT @noNull EXEC master..xp_cmdshell @cmd

    SET @cmd = 'echo binary >> ' + @workfilename
     INSERT @noNull EXEC master..xp_cmdshell @cmd

    SET @cmd = 'echo put ' + @SourcePath + @SourceFile + ' ' + ISNULL(@FTPFileName, '') + ' >> ' + @workfilename
     INSERT @noNull EXEC master..xp_cmdshell @cmd

    SET @cmd = 'echo dir ' + ISNULL(@FTPFileName, @SourceFile) + ' >> ' + @workfilename
     INSERT @noNull EXEC master..xp_cmdshell @cmd

    SET @cmd = 'echo quit' + ' >> ' + @workfilename
     INSERT @noNull EXEC master..xp_cmdshell @cmd

    SET @cmd = 'ftp -s:' + @workfilename
     DECLARE @a TABLE (
         id INT identity(1, 1)
         ,s VARCHAR(1000)
         );

    IF (@debug = 1)
     BEGIN
         SET @cmd = 'TYPE ' +  @workfilename
         EXEC master..xp_cmdshell @cmd
     END
     ELSE
     BEGIN
     INSERT @a EXEC master..xp_cmdshell @cmd;
         SELECT id, ouputtmp = s
         FROM @a;
     END
 END
 GO

Classé dans : sqlscript - Mots clés : aucun

MySql Reset root password

Rédigé par Sozezzo - - Aucun commentaire
Step by step how you can change 'root' password
 
You must have rights to stop/start services, and kill process.
 
Step 1: Stop MySql service
run: services.msc
...
 
Step 2 : Create file to reset password
You can use your password and your file name.
We use password : Pass1Word2
and file name : C:\temp\reset.txt
USE mysql;
UPDATE mysql.user SET Password=PASSWORD('Pass!Word@') WHERE User='root';
FLUSH PRIVILEGES;
 
Step 3 : Find our my.ini file
It is usually locate on 'C:\ProgramData\MySQL\MySQL Server ????\my.ini'
But, you can try to find using :
C:\ dir my.ini /s /b
You can check MySQL service's property.
...
For this sample, we use this:
C:\ProgramData\MySQL\MySQL Server 5.5\my.ini
 
Step 4 : Navigate to MySql bin directory
Open command prompt there.
...
Type command :
mysqld --defaults-file="C:\\ProgramData\\MySQL\\MySQL Server 5.5\\my.ini" --init-file=C:\temp\reset.txt
Attention : Use double "\\" insted "\"
 
Step 5 : Open "Task Manager" and kill process "mysqld.exe"
Step 6: Start service "MySql"
By now, we have a new password.
cls
@echo off
cls
echo.
echo * * * Reset MySql password * * *
echo.
pause
echo.
echo Stop MySql Service
echo.
sc stop MySql
echo.
pause
echo.
echo Kill mysqld.exe
echo.
taskkill -f -im mysqld.exe
echo.
pause
echo.
rem dir "C:\ProgramData\MySQL\MySQL Server 5.5\my.ini"
echo.
echo Run MySqlD
echo.
"C:\Program Files\MySQL\MySQL Server 5.5\bin\mysqld"   --defaults-file="C:\Program Files\MySQL\MySQL Server 5.5\my.ini" --init-file=C:\Temp\reset.txt
echo.
pause
echo.
echo Start MySql Service
echo.
sc start MySql
echo.
pause
echo.
echo Try to connect
echo.
"C:\Program Files\MySQL\MySQL Server 5.5\bin\mysql.exe" "--defaults-file=C:\Program Files\MySQL\MySQL Server 5.5\my.ini" "-uroot" "-p"
echo.
cd\temp
echo.
** Attention : Make sure all file are ANSI

Simple log connections SQLServer 2000

Rédigé par Sozezzo - - Aucun commentaire

This code create a table to log all connections.

It is very simple, it just logs when, who, from where and which database.

For this we use “master.dbo.sysprocesses”

 

https://docs.microsoft.com/en-us/sql/relational-databases/system-compatibility-views/sys-sysprocesses-transact-sql?view=sql-server-2017


Create table to log on [Master] database.

 USE [master] GO CREATE TABLE [dbo].[dbaLogAccess] (     [dbaLogAccessId] [int] IDENTITY (1, 1) NOT NULL ,     [ConnectionDate] [datetime] NULL ,     [loginame] [nvarchar] (128) COLLATE SQL_Latin1_General_CP1_CI_AI NULL ,     [hostname] [nchar] (128) COLLATE SQL_Latin1_General_CP1_CI_AI NOT NULL ,     [dbname] [nvarchar] (128) COLLATE SQL_Latin1_General_CP1_CI_AI NULL ) ON [PRIMARY] 

Script to add logs, you can run each minute to update the log. This script avoids to repeater, it only saves new connections. We recommend using a job and schedule each minute to run this script.

 INSERT INTO master.dbo.dbaLogAccess (ConnectionDate, loginame, hostname, dbname)   SELECT DISTINCT     tbNew.ConnectionDate,     tbNew.loginame,     tbNew.hostname,     tbNew.dbname   FROM (SELECT     CONVERT(char(10), GETDATE(), 126) AS ConnectionDate,     RTRIM(loginame) AS loginame,     hostname,     CASE       WHEN dbid = 0 THEN ''       WHEN dbid <> 0 THEN DB_NAME(dbid)     END AS dbname   FROM master.dbo.sysprocesses   WHERE (hostname <> '')) AS tbNew   LEFT OUTER JOIN master.dbo.dbaLogAccess AS tbOld     ON tbNew.ConnectionDate = tbOld.ConnectionDate     AND tbNew.loginame = tbOld.loginame     AND tbNew.hostname = tbOld.hostname     AND tbNew.dbname = tbOld.dbname   WHERE (tbOld.dbaLogAccessId IS NULL); 

This code limit connection by day, we can change by hour or by minute, you just change how many character you use it:
 print CONVERT(char(14), GETDATE(), 126) + '00:00'
print CONVERT(char(17), GETDATE(), 126) + '00'
print CONVERT(char(20), GETDATE(), 126)

Well, you may do not like to use [master] database, but it is the place to record the system-level information. Good news, you can easily change it.

or you can use : https://www.sqlshack.com/creating-successful-auditing-strategy-sql-server-databases/

 

 

 

Fil RSS des articles de cette catégorie