12 messaggi dal 20 gennaio 2010
sto cercando di trasferire un database che fa da piattaforma ai miei siti internet da un servizio di hosting esterno (azienda esterna che fornisce un spazio per DB SQL SERVER con annesso pannello di controllo web.... una schifezza) al mio server con SQL SERVER 2008 express.

il database sorgente ha tabelle, viste e SP con uno schema diverso da dbo (ereditate dal backup di questa azienda) e sono obbligato a richiamare le procedure mettendo davanti il nome dello schema (dovrei modificare ogni singolo file ASP).

non potendolo fare vorrei capire come riuscire a cambiare lo schema di tabelle viste e SP.

ho provato a creare un nuovo database creando gli script dal vecchio DB, togliendo lo schema e rigenerare tutta la struttura.

il problema è quando cerco di ripopolare il nuovo DB: da attività -> importa dati di SQLMS non collega i nomi delle tabelle avendo lo schema diverso, dovrei incrociarle una a una (sono migliaia) e creando invece una insert per ogni tabella mi fregano i campi identity.

dovrei fare lo switching in un week end spegnendo IIS e sto cercando la via più veloce che attualmente sembrerebe essere quella di creare uno script di insert togliendo le tabelle con campi identity

select o.name as tabella, i.name as campo
from sys.identity_columns i
inner join sys.tables o on i.object_id = o.object_id

per poi fare un lavoro a manina per le tabelle con campi identity,

quancuno sa darmi qualche consiglio?
Modificato da astambara il 21 gennaio 2010 09.15 -
Modificato da astambara il 21 gennaio 2010 09.17 -
Modificato da astambara il 21 gennaio 2010 09.23 -
994 messaggi dal 19 dicembre 2003
Contributi | Blog
astambara ha scritto:
il database sorgente ha tabelle, viste e SP con uno schema diverso da dbo (ereditate dal backup di questa azienda) e sono obbligato a richiamare le procedure mettendo davanti il nome dello schema (dovrei modificare ogni singolo file ASP).


Non è necessario. Tra le proprietà di ogni user c'è la "default schema". Se lo user che accede al database ha la proprietà default schema impostata ad esempio a Pippo, ogni volta che egli fa una query tipo

SELECT campi FROM tabella

SQL Server trasformerà implicitamente la query di cui sopra in

SELECT campi FROM Pippo.tabella

se non esistesse l'oggetto Pippo.tabella allora SQL Server fa un tentativo con

SELECT campi FROM dbo.tabella

e solo se non esiste neanche questo oggetto viene restituito un errore di "oggetto inesistente". Quindi la prima strada che hai è quella di modificare il default schema dello user e avresti già risolto...

vorrei capire come riuscire a cambiare lo schema di tabelle viste e SP.


Puoi trasferire un oggetto da uno schema all'altro con il comando

ALTER SCHEMA schema_di_destinazione TRANSFER schema_di_origine.oggetto

ho provato a creare un nuovo database creando gli script dal vecchio DB, togliendo lo schema e rigenerare tutta la struttura.


Lavoro certosino, ma è la terza strada...

il problema è quando cerco di ripopolare il nuovo DB: da attività -> importa dati di SQLMS non collega i nomi delle tabelle avendo lo schema diverso, dovrei incrociarle una a una (sono migliaia) e creando invece una insert per ogni tabella mi fregano i campi identity.


Non l'avrei fatto così... SSMS, nella versione 2008, permette di generare gli script non solo DDL ma anche quelli di insert into (click con il destro sul DB -> Tasks -> Generate SQL Script). Non so se lo script sospende temporaneamente la proprietà identity (SET IDENTITY INSERT ON) ma al massimo si tratta di aggiungere questa correzione su quelle tabelle che hanno la proprietà identity (solo una tabella alla volta può avere la proprietà impostata). Questa strada comunque pur nella sua fattibilità è la più onerosa rispetto alle altre 2.

dovrei fare lo switching in un week end


Con la prima soluzione (modifica del default schema) ci metti 20 secondi; con la seconda (ALTER SCHEMA) al max 2-3 minuti. Il tuo week end è salvo... :-)

Bye

Luca Bianchi
Microsoft MVP - SQL Server
12 messaggi dal 20 gennaio 2010
provo subito le altre 2 soluzioni, che erano quelle che cercavo

grazie 1000, a breve l'esito
12 messaggi dal 20 gennaio 2010
 se non metto il nome dello schema davanti alla SP mi dice
"Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
Impossibile trovare la stored procedure 'lista_responsabili'"

ho creato un nuovo utente per poter modificare il default schema (non mi permetteva di farlo in SA) nella sezione Protezione -> Account di accesso

in mapping utenti ho inserito il default schema del nuovo DB (sezione Mapping Utenti del utente appena creato nella sezione Protezionedell'istanza.

ho dato sysadmin come ruolo al nuovo utente altrimenti non mi dava i permessi per effettuare la connessione al DB.

Nonostante questo vuole ancora il nome dello schema prima della SP....


questo nella pagina ASP

var objRst = Server.CreateObject("ADODB.RecordSet")
var command = Server.CreateObject("ADODB.Command")
command.CommandText = "lista_responsabili"
command.CommandType = adCmdStoredProc
command.Parameters.Append (command.CreateParameter("@id_azienda", adInteger, adParamInput, 3, id_azienda))
command.ActiveConnection = Session("conn_NUOVO_DB")
objRst = command.Execute

nel global.asa

Session("conn_NUOVO_DB") = Server.CreateObject("ADODB.Connection")
Session("conn_NUOVO_DB").ConnectionTimeout = 60
Session("conn_NUOVO_DB").CommandTimeout = 60
Session("conn_NUOVO_DB").Open("DSN=NUOVO_DB;UID=NUOVOUTENTE;PWD=XXXXX;")

a NUOVO_UTENTE ho associato il nuovo schema di default

se invece metto
command.CommandText = "NUOVO_SCHEMA.lista_responsabili"
funziona bene
Modificato da astambara il 21 gennaio 2010 14.58 -
994 messaggi dal 19 dicembre 2003
Contributi | Blog
astambara ha scritto:
ho dato sysadmin come ruolo al nuovo utente altrimenti non mi dava i permessi per effettuare la connessione al DB.


Se si potessero connettere solo i sysadmin sarebbe folle, non trovi? Verifica quello che hai fatto perchè non c'è nessuna logica in quello che scrivi.

Nonostante questo vuole ancora il nome dello schema prima della SP....


Segui e riproduci nel tuo ambiente questo esempio

USE master;
GO

--Creo un db di prova
CREATE DATABASE Test;
GO

--Creo un login a cui, ovviamente, non assegno alcun ruolo amministrativo
CREATE LOGIN Luca WITH PASSWORD = 'LB;123';
GO

USE Test;
GO

--Creo lo schema
CREATE SCHEMA MySchema;
GO

--Creo un utente sul login Luca e gli assegno il default schema
CREATE USER Luca FOR LOGIN Luca WITH DEFAULT_SCHEMA = MySchema;
GO

--Creo una sp
CREATE PROC MySchema.MyProc
AS
SELECT GETDATE();
GO

--Assegno i necessari permessi
GRANT EXECUTE ON MySchema.MyProc TO Luca;
GO

--Luca è in grado di eseguirla oppure no? :-)
EXECUTE AS USER = 'Luca'
EXEC MyProc
REVERT

Verifica la rispondenza di questo esempio con quanto hai fatto tu. Se il problema persiste non è a livello di SQL Server ma è a livello di codice...

Bye

Luca Bianchi
Microsoft MVP - SQL Server
12 messaggi dal 20 gennaio 2010
l.bianchi ha scritto:

Se si potessero connettere solo i sysadmin sarebbe folle, non trovi? Verifica quello che hai fatto perchè non c'è nessuna logica in quello che scrivi.


per quanto riguarda il sysadmin ho replicato il ruolo che avevano i miei DB nel DB importato, facendo un operazione empirica, senza però considerarla come LA Soluzione.....

ma tornando al problema:
il tuo esempio funziona bene su MSS Management Studio e pure se replicato all'interno del mio DB con i miei schemi, utenti etc.
ma a parte questo non funziona ancora nel mio sito, mentre con la seconda soluzione spostando l'oggetto da uno schema all'altro, ovvero da SCHEMA_DB_IMPORTATO a DBO va alla grande.

propendendo per la seconda soluzione...
domanda: per spostare tutto su dbo esiste un sitema veloce o devo crearmi uno scriptone gigante per tabelle, viste e SP?
Modificato da astambara il 21 gennaio 2010 17.00 -
12 messaggi dal 20 gennaio 2010
trovata una soluzione semplice e banale

CREATE PROCEDURE [dbo].[CAMBIA_SCHEMA_PROCEDURE]
AS
BEGIN

SET NOCOUNT ON

DECLARE @name nvarchar(400)

DECLARE azienda_cursor CURSOR FOR
SELECT name FROM sys.procedures

OPEN azienda_cursor

FETCH NEXT FROM azienda_cursor
INTO @name

WHILE @@FETCH_STATUS = 0
BEGIN
SET @name = 'ALTER SCHEMA dbo TRANSFER MSSql11319.' + @name

EXEC sp_executesql
@stmt = @name

FETCH NEXT FROM azienda_cursor
INTO @name
END

CLOSE azienda_cursor
DEALLOCATE azienda_cursor

END

idem per tabelle e views:
con SELECT name FROM sys.tables
con SELECT name FROM sys.views
994 messaggi dal 19 dicembre 2003
Contributi | Blog
Il cursore puoi popolarlo con questa query

SELECT ROUTINE_NAME
FROM INFORMATION_SCHEMA.ROUTINES
UNION ALL
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES

(in routines ci sono sia le sp che le udf; in tables ci sono sia le tabelle che le viste).
Per quanto dicevi nel post precedente non è che stai lavorando con questi signori qui

http://community.ugiss.org/blogs/lbianchi/archive/2008/06/26/owner-schema-e-
permessi-su-aruba.aspx

Hai verificato che i permessi siano stati assegnati correttamente?
Altrimenti, visto che hai detto che in SSMS tutto funziona regolarmente non
resta che un errore nel codice.

Bye

Luca Bianchi
Microsoft MVP - SQL Server

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
In primo piano

I più letti di oggi

Media
In evidenza
MISC