Friday, 4 June 2021

Redshift Table Creation Scripts

select * from admin.v_generate_tbl_ddl where schemaname ='nameofschema' and tablename='nameoftable';

If the view v_generate_tbl_ddl is not in your admin schema, you can create it using below sql provided by the AWS Redshift team.

https://github.com/awslabs/amazon-redshift-utils/blob/master/src/AdminViews/v_generate_tbl_ddl.sqlt-database/

Reference:

https://awsbytes.com/how-to-get-the-ddl-of-a-table-in-redshift-database/

Thursday, 11 March 2021

SQL Server - Backup Location and other information

Objective:

To find the database backup history information from the SQL Server. Tested on SQL Server 2017.


SELECT  

   A.[Server],  

   A.last_db_backup_date,  

   B.backup_start_date,  

   B.expiration_date, 

   B.backup_size,  

   B.logical_device_name,  

   B.physical_device_name,   

   B.backupset_name, 

   B.description 

FROM 

   ( 

   SELECT   

       CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server, 

       msdb.dbo.backupset.database_name,  

       MAX(msdb.dbo.backupset.backup_finish_date) AS last_db_backup_date 

   FROM    msdb.dbo.backupmediafamily  

       INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id  

   WHERE   msdb..backupset.type = 'D' 

   GROUP BY 

       msdb.dbo.backupset.database_name  

   ) AS A 

    

   LEFT JOIN  


   ( 

   SELECT   

   CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server, 

   msdb.dbo.backupset.database_name,  

   msdb.dbo.backupset.backup_start_date,  

   msdb.dbo.backupset.backup_finish_date, 

   msdb.dbo.backupset.expiration_date, 

   msdb.dbo.backupset.backup_size,  

   msdb.dbo.backupmediafamily.logical_device_name,  

   msdb.dbo.backupmediafamily.physical_device_name,   

   msdb.dbo.backupset.name AS backupset_name, 

   msdb.dbo.backupset.description 

FROM   msdb.dbo.backupmediafamily  

   INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id  

WHERE  msdb..backupset.type = 'D' 

   ) AS B 

   ON A.[server] = B.[server] AND A.[database_name] = B.[database_name] AND A.[last_db_backup_date] = B.[backup_finish_date] 

ORDER BY  

   A.database_name 

Wednesday, 15 July 2020

How to transfer users from one instance to another


Firstly, type in this query which is shown below:


USE master
GO
IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
  DROP PROCEDURE sp_hexadecimal
GO
CREATE PROCEDURE sp_hexadecimal
    @binvalue varbinary(256),
    @hexvalue varchar (514) OUTPUT
AS
DECLARE @charvalue varchar (514)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
SELECT @charvalue = '0x'
SELECT @i = 1
SELECT @length = DATALENGTH (@binvalue)
SELECT @hexstring = '0123456789ABCDEF'
WHILE (@i <= @length)
BEGIN
  DECLARE @tempint int
  DECLARE @firstint int
  DECLARE @secondint int
  SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
  SELECT @firstint = FLOOR(@tempint/16)
  SELECT @secondint = @tempint - (@firstint*16)
  SELECT @charvalue = @charvalue +
    SUBSTRING(@hexstring, @firstint+1, 1) +
    SUBSTRING(@hexstring, @secondint+1, 1)
  SELECT @i = @i + 1
END

SELECT @hexvalue = @charvalue
GO

IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
  DROP PROCEDURE sp_help_revlogin
GO
CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
DECLARE @name sysname
DECLARE @type varchar (1)
DECLARE @hasaccess int
DECLARE @denylogin int
DECLARE @is_disabled int
DECLARE @PWD_varbinary  varbinary (256)
DECLARE @PWD_string  varchar (514)
DECLARE @SID_varbinary varbinary (85)
DECLARE @SID_string varchar (514)
DECLARE @tmpstr  varchar (1024)
DECLARE @is_policy_checked varchar (3)
DECLARE @is_expiration_checked varchar (3)

DECLARE @defaultdb sysname

IF (@login_name IS NULL)
  DECLARE login_curs CURSOR FOR

      SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
sys.server_principals p LEFT JOIN sys.syslogins l
      ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'
ELSE
  DECLARE login_curs CURSOR FOR


      SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
sys.server_principals p LEFT JOIN sys.syslogins l
      ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name
OPEN login_curs

FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
IF (@@fetch_status = -1)
BEGIN
  PRINT 'No login(s) found.'
  CLOSE login_curs
  DEALLOCATE login_curs
  RETURN -1
END
SET @tmpstr = '/* sp_help_revlogin script '
PRINT @tmpstr
SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
PRINT @tmpstr
PRINT ''
WHILE (@@fetch_status <> -1)
BEGIN
  IF (@@fetch_status <> -2)
  BEGIN
    PRINT ''
    SET @tmpstr = '-- Login: ' + @name
    PRINT @tmpstr
    IF (@type IN ( 'G', 'U'))
    BEGIN -- NT authenticated account/group

      SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'
    END
    ELSE BEGIN -- SQL Server authentication
        -- obtain password and sid
            SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
        EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT
        EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT

        -- obtain password policy state
        SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
        SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name

            SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'

        IF ( @is_policy_checked IS NOT NULL )
        BEGIN
          SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
        END
        IF ( @is_expiration_checked IS NOT NULL )
        BEGIN
          SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
        END
    END
    IF (@denylogin = 1)
    BEGIN -- login is denied access
      SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
    END
    ELSE IF (@hasaccess = 0)
    BEGIN -- login exists but does not have access
      SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
    END
    IF (@is_disabled = 1)
    BEGIN -- login is disabled
      SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
    END
    PRINT @tmpstr
  END

  FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
   END
CLOSE login_curs
DEALLOCATE login_curs
RETURN 0
GO

Secondly, on the same machine execute this query:

EXEC sp_help_revlogin

Thirdly, copy the output and on another instance paste the
 output and all the users will be added. 

Monday, 1 April 2019

While Loop to Create Login and Execute

Create Login if not exists.


drop table #temp
go
Create table #temp (id int identity(1,1),loginname varchar(50), [status] bit default 0)
go
insert into #temp (loginname) select 'domainname\aarthi'
insert into #temp (loginname) select 'domainname\AANTONIOU'
insert into #temp (loginname) select 'domainname\ARULM'
insert into #temp (loginname) select 'domainname\ahull'
insert into #temp (loginname) select 'domainname\atesfay'
insert into #temp (loginname) select 'domainname\BXMARQUEZ'
insert into #temp (loginname) select 'domainname\camodei'

insert into #temp (loginname) select 'domainname\rnicol'
insert into #temp (loginname) select 'domainname\rramasubramanian'
insert into #temp (loginname) select 'domainname\salderidge'
insert into #temp (loginname) select 'domainname\SBOOGICH'
insert into #temp (loginname) select 'domainname\SGENYERY'
insert into #temp (loginname) select 'domainname\shaJsan'
insert into #temp (loginname) select 'domainname\skhHanom'
insert into #temp (loginname) select 'domainname\SMORJAN'
insert into #temp (loginname) select 'domainname\SROBUERTS'
insert into #temp (loginname) select 'domainname\STAON'
insert into #temp (loginname) select 'domainname\SWERLSH'
insert into #temp (loginname) select 'domainname\sxpkearce'
insert into #temp (loginname) select 'domainname\vxgatrdner'
go

set nocount on;
while (select count(*) from #temp where [status] = 0) > 0
begin

    declare @id int = (select top 1 id from #temp where [status] = 0 order by id asc)

       declare @SqlStatement sysname
       declare @loginname varchar(50)
       select @loginname = loginname from #temp where id = @id

    select @id as idvalue, @loginname as loginname

       If not Exists (select loginname from master.dbo.syslogins
    where name = @loginName and dbname = 'master')

    Select @SqlStatement = 'CREATE LOGIN ' + QUOTENAME(@loginName) + '
    FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english])'

print @SqlStatement
    --EXEC sp_executesql @SqlStatement

update #temp set [status] = 1  where id = @id
end
set nocount off;

go
select * from #temp


Sunday, 17 March 2019

SSRS Date Format using Expression


Any column display with value of 1/1/1900 12:00:00 AM even after the SQL Server Query output is correct, you need to follow the below IIF statement in expression of SSRS


SELECT [ReviewDate] AS  [ReviewDate] from Tablename.


Review Date is datetime.


Solution to SSRS is: Editing the value like below. If the value is Null or Empty, the below one is a good one for that issue


=IIF(Fields!ReviewDate.Value="1/1/1900 12:00:00 AM","",Format(Fields!ReviewDate.Value,"dd-MM-yyyy"))




In SQL Server, you can use the query



SELECT isnull(Convert(Varchar(10),[ReviewDate],105),'') AS  [ReviewDate] from TableName



However, although the above SQL display is correct, it won't help in SSRS. Therefore, one should follow the above IIF statments, that is



=IIF(Fields!ReviewDate.Value="1/1/1900 12:00:00 AM","",Format(Fields!ReviewDate.Value,"dd-MM-yyyy"))





Normal Date Format formula is as per below:

=Format(CDate(Fields!ReviewDate.Value), "dd-MM-yyyy") -- Works well