Login Login
MORE

WIDGETS

Widgets

Wanted articles
Who is online?
Article tools

MSSQL:Script Utili2

From Aino Wiki

Jump to: navigation, search

Ricerche

Testo in Stored Procedure e Funzioni

SELECT name
FROM   sys.procedures
WHERE  Object_definition(object_id) LIKE '%''MGM''%'

Soluzione a problemi

Resettare campo password in una tabella

Capita di dover resettare un campo password di un record in tabella con una di default conosciuta. Il problema è nel fatto che il campo password è crittografato quindi non si può nè copiare ed incollare semplicemente e nè decodificare quindi si può copiare la password usata in un record per impostare quella di un altra, ecco la tecnica

-- Per prova metto a confronto in un unico rigo la password del record da cambiare
-- con quella del record da usare come copia template
SELECT 
  am_dest.Password P_Dest, 
  am_dest.PasswordSalt P_Dest_salt, 
  am_source.Password P_Source,
  am_source.PasswordSalt P_Source_salt
FROM [FoxCCAccounts].[dbo].[aspnet_Membership] as am_dest,
     [FoxCCAccounts].[dbo].[aspnet_Membership] as am_source
where am_source.UserId = '6D005825-8DE3-4690-B521-E2D5B1F047AC'
	and am_dest.UserId = '4D750AA6-C87A-4FDA-A9A4-C5D66016A251'
 
-- Infine l'update:
UPDATE am_dest
	SET  am_dest.Password = am_source.Password,
		 am_dest.PasswordSalt = am_source.PasswordSalt
FROM [FoxCCAccounts].[dbo].[aspnet_Membership] as am_dest,
     [FoxCCAccounts].[dbo].[aspnet_Membership] as am_source
where am_source.UserId = '6D005825-8DE3-4690-B521-E2D5B1F047AC'
	and am_dest.UserId = '4D750AA6-C87A-4FDA-A9A4-C5D66016A251'

Esecuzione di una store con parametri funzioni

Se si vuol eseguire una store procedure da Management studio passando, ad es, in alcuni parametri la data odierna con la funzione GetDate() occorrerà eludere il problema come segue, usando la valorizzazione esterna dei parametri.

EXEC	[dbo].[p_CU_B_ACC_TRACK_EXT_NZL_Insert]
		@COMPANY_CODE = '071',
		@DIVISION_CODE = '001',
		@CUSTOMER_CODE = '075900MP',
		@DT_CLAIM_LODGED = @data,
		@DT_QUESTIONNAIR_COMPLETE = @data,
		@DT_ENT_APPOINTMENT_SCHEDULED = @data,
		@DT_AUDIOGRAM_SENT = @data,
		@DT_ENT_APPOINTMENT = @data,
		@DT_NEXT_RECALL = @data,
		@FLG_FUNDING_APPROVED = '0',
		@FLG_FUNDING_COMPETITOR = '0',
		@FLG_FUNDING_DECLINED = '0',
		@FLG_NOT_MOTIVATED = '0',
		@FLG_NOT_CONTACT = '0',
		@FLG_NOT_COMPETITOR = '0',
		@FLG_ACC_NEW = '0',
		@FLG_ACC_REAID = '0',
		@USERINSERT = 'SPXMIW2869\giuseppe.aino',
		@ROWGUID = '00000000-0000-0000-0000-000000000000'

Conversioni

Numeri da base a base

Da base N a decimale

CREATE FUNCTION dbo.fn_FromBasenTo10(@String varchar(20),@N int)
RETURNS BIGINT
AS
BEGIN
  DECLARE @Result AS BIGINT = 0,
    @basestring AS VARCHAR(100) = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
    @digit	AS CHAR,
    @pow	AS BIGINT = 0
 
  WHILE @pow < len(@String) BEGIN
    set @digit = substring(reverse(@String), @Pow+1,1)
    set @Result = @Result + (charindex(@Digit, @baseString) - 1) * power(@N, @pow)
    set @pow = @pow + 1
  END
  RETURN @Result
END
GO
--------------------- Uso --------------------
select dbo.fn_FromBasenTo10('001L9', 36) --Restituirà: 2061

Da base decimale a base 32

CREATE FUNCTION dbo.fn_FromBase10To36
(
    @Val BIGINT
)
RETURNS VARCHAR(9)
AS
BEGIN
    DECLARE @Result VARCHAR(9) = ''
 
    IF (@Val <= 0)
    BEGIN
        RETURN '0'
    END
 
    WHILE (@Val > 0)
    BEGIN
        SELECT @Result = CHAR(@Val % 36 + CASE WHEN @Val % 36 < 10 THEN 48 ELSE 55 END) + @Result,
               @Val = FLOOR(@Val/36)
    END
 
    RETURN @Result
END
GO
--------------------- Uso --------------------
select dbo.fn_FromBase10To36(2061) --Restituirà: '001L9'

Templates

Script in transazione

Esempio di come costruire uno script che, usando una transazione,

-- DEVELOPER NAME – REFERENCE GAP/BUG 
 
SET XACT_ABORT ON;
 
BEGIN TRY
    BEGIN TRANSACTION;
 
    -- Code goes here
 
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
 
    DECLARE
        @ERROR_SEVERITY INT,
        @ERROR_STATE    INT,
        @ERROR_NUMBER   INT,
        @ERROR_LINE     INT,
        @ERROR_MESSAGE  NVARCHAR(4000);
 
    SELECT
        @ERROR_SEVERITY = ERROR_SEVERITY(),
        @ERROR_STATE    = ERROR_STATE(),
        @ERROR_NUMBER   = ERROR_NUMBER(),
        @ERROR_LINE     = ERROR_LINE(),
        @ERROR_MESSAGE  = ERROR_MESSAGE();
 
    RAISERROR('Msg %d, Line %d, :%s',
        @ERROR_SEVERITY,
        @ERROR_STATE,
        @ERROR_NUMBER,
        @ERROR_LINE,
        @ERROR_MESSAGE);
END CATCH

Correzione di errori

Autenticazione

Se da una una applicazione WEB .Net non si riesce ad accedere al DB, usando l'autenticazione integrata di Windows, a causa del seguente errore:

Login failed for user 'IIS APPPOOL\DefaultAppPool'

Ciò è dovuto al fatto che l'utente IIS non ha diritti per acedere al DB neanche in sola lettura. Il seguente script, da lanciare sul DB Master, crea una nuova Login e nuovo utente da associare all'aplication Pool, ATTENZIONE che dopo averlo fatto occorrerà finalmente associare i diritti\ruoli che si vogliono all'utente sul DB su cui si vuol lavorare.

IF NOT EXISTS (SELECT name FROM sys.server_principals WHERE name = 'IIS APPPOOL\DefaultAppPool')
BEGIN
    CREATE LOGIN [IIS APPPOOL\DefaultAppPool] 
      FROM WINDOWS WITH DEFAULT_DATABASE=[master], 
      DEFAULT_LANGUAGE=[us_english]
END
GO
CREATE USER [WebDatabaseUser] 
  FOR LOGIN [IIS APPPOOL\DefaultAppPool]
GO
EXEC sp_addrolemember 'db_owner', 'WebDatabaseUser'
GO

Relazioni e Constraint

Gerarchia relazioni

Assegna un livello più basso alle tabelle che hanno meno relazioni esterne, sono le tabelle di lookup ovvero quelle che son più referenziate dalle altre

   WITH FK_TABLES AS (
    SELECT    S1.NAME AS FROM_SCHEMA    
    ,        O1.NAME AS FROM_TABLE    
    ,        S2.NAME AS TO_SCHEMA    
    ,        O2.NAME AS TO_TABLE    
    FROM    SYS.FOREIGN_KEYS FK    
    INNER    JOIN SYS.OBJECTS O1    
    ON        FK.PARENT_OBJECT_ID = O1.OBJECT_ID    
    INNER    JOIN SYS.SCHEMAS S1    
    ON        O1.SCHEMA_ID = S1.SCHEMA_ID    
    INNER    JOIN SYS.OBJECTS O2    
    ON        FK.REFERENCED_OBJECT_ID = O2.OBJECT_ID    
    INNER    JOIN SYS.SCHEMAS S2    
    ON        O2.SCHEMA_ID = S2.SCHEMA_ID    
    /*FOR THE PURPOSES OF FINDING DEPENDENCY HIERARCHY       
        WE'RE NOT WORRIED ABOUT SELF-REFERENCING TABLES*/
    WHERE    NOT    (    S1.NAME = S2.NAME                 
            AND        O1.NAME = O2.NAME)
)
,ORDERED_TABLES AS 
(        SELECT    S.NAME AS SCHEMANAME
        ,        T.NAME AS TABLENAME
        ,        0 AS LEVEL    
        FROM    (    SELECT    *                
                    FROM    SYS.TABLES                 
                    WHERE    NAME <> 'SYSDIAGRAMS') T    
        INNER    JOIN SYS.SCHEMAS S    
        ON        T.SCHEMA_ID = S.SCHEMA_ID    
        LEFT    OUTER JOIN FK_TABLES FK    
        ON        S.NAME = FK.FROM_SCHEMA    
        AND        T.NAME = FK.FROM_TABLE    
        WHERE    FK.FROM_SCHEMA IS NULL
        UNION    ALL
        SELECT    FK.FROM_SCHEMA
        ,        FK.FROM_TABLE
        ,        OT.LEVEL + 1    
        FROM    FK_TABLES FK    
        INNER    JOIN ORDERED_TABLES OT    
        ON        FK.TO_SCHEMA = OT.SCHEMANAME    
        AND        FK.TO_TABLE = OT.TABLENAME
)SELECT    DISTINCT    OT.SCHEMANAME
,        OT.TABLENAME
,        OT.LEVEL
FROM    ORDERED_TABLES OT
INNER    JOIN (
        SELECT    SCHEMANAME
        ,        TABLENAME
        ,        MAX(LEVEL) MAXLEVEL        
        FROM    ORDERED_TABLES        
        GROUP    BY SCHEMANAME,TABLENAME
        ) MX
ON        OT.SCHEMANAME = MX.SCHEMANAME
AND        OT.TABLENAME = MX.TABLENAME
AND        MX.MAXLEVEL = OT.LEVEL
 AND  OT.TABLENAME LIKE '%[_]S[_]%'
 or OT.TABLENAME LIKE 'SY%'
 ORDER BY OT.LEVEL DESC , OT.TABLENAME

Constraint Toglierli

Per singola tabella

ALTER TABLE tableName NOCHECK CONSTRAINT ALL

Per TUTTE le tabelle in automatico

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

Constraint Ristabilirli

Per singola tabella

ALTER TABLE tableName WITH CHECK CHECK CONSTRAINT ALL

Per TUTTE le tabelle in automatico

EXEC sp_msforeachtable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'

Per tutte le tabelle senza interruzione al primo errore:


Mappa e Link


MS SQL |



Parole chiave:

Author