77 messaggi dal 09 ottobre 2001
Ciao a tutti, vi espongo il mio problema:

poichè sto implementando una web application che si appoggia sul sql server 2000, ho la necessità di creare uno script che mi cambi il tipo di una colonna di una determinata tabella. Siccome la colonna è a metà della tabella e non voglio che cambi la sua posizione, sono costretto a creare una tabella temporanea a mio piacimento, fare il travaso dei dati, cancellare la vecchia tabella e rinominare la temporanea col nome della tabella cancellata.
Così facendo perdo i triggers che sono attaccati alla tabella originale.
Come posso fare per mantenerli??
Ho provato ad agire direttamente su sysobjects ma l'operazione di update su quelle tabelle non è permessa...

come posso fare??

Grazie

Andrea M.
1.024 messaggi dal 19 dicembre 2003
Contributi | Blog
Per modificare il datatype di un campo si utilizza il comando ALTER TABLE che non altera la posizione del campo all'interno della tabella. Segui questo esempio

--Creo una tabella di prova
CREATE TABLE dbo.T1
(
c1 smallint not null,
c2 smallint not null,
c3 smallint not null
)
GO

--La popolo con un paio di record
INSERT dbo.T1 VALUES (1, 2, 3)
INSERT dbo.T1 VALUES (4, 5, 6)
GO

--Modifico il datatype della seconda colonna
ALTER TABLE dbo.T1
ALTER COLUMN c2 VARCHAR(10) not null
GO

--Ma ciò non altera la sua posizione nella struttura
SELECT *
FROM dbo.T1
GO

Diverso invece il discorso se devi aggiungere un campo (ma da ciò che scrivi sembra non essere questo il tuo caso). In questo caso con i comandi T-SQL (ancora una volta è il comando ALTER TABLE) sei in grado di aggiungere il campo in fondo alla tabella e non in una posizione arbitraria. Premesso che la posizione di un campo all'interno di una tabella non deve avere alcun significato in quanto in fase di estrazione dei dati è sempre buona norma referenziare esplicitamente i campi senza utilizzare il carattere [*], puoi sempre ovviare a ciò utilizzando Enterprise Manager il quale si dimostra in grado di eseguire l'attività. In realtà andando ad osservare i passaggi che compie per aggiungere una colonna noterai che esegue gli stessi passi che tu hai descritto (crea una nuova tabella, travasa i dati, elimina la vecchia e rinomina la nuova come la vecchia); solo che lo fa in maniera "più furba" salvaguardando trigger e constraints... :-)

Bye
77 messaggi dal 09 ottobre 2001
So che alter table mi modifica il tipo della colonna, ma lo posso fare solo se i dati presenti sono compatibili col nuovo tipo che sto cercando di introdurre, cmq mi sono espresso in maniera incompleta, infatti il mio problema è anche inserire a metà tabella, so anche che l'ordine non dovrebbe incidere, ma chi ha operato prima di me ha fatto si che l'ordine fosse fondamentale. Poi mi serve generare uno script che faccia queste variazione, non posso usare l'enterprise manager e per finire lo script incriminato l'ho fatto generare proprio dall'enterprise manager...

Andrea
77 messaggi dal 09 ottobre 2001
in più dovrei non sapere a priori quanti e quali trigger ho sulla tabella...

A.
1.024 messaggi dal 19 dicembre 2003
Contributi | Blog
Non so come tu abbia fatto le tue prove o se hai una versione taroccata di SQL Server 2000 ma utilizzando questo esempio

=========================
CREATE TABLE dbo.A
(
id smallint not null,
c1 varchar(50) not null
)
GO

CREATE TABLE dbo.B
(
id smallint not null,
c1 varchar(50) not null,
c2 datetime not null
)
GO

CREATE TRIGGER tr_A_d ON dbo.A
FOR DELETE
AS
INSERT dbo.B
SELECT id, c1, GETDATE()
FROM DELETED
GO

CREATE TRIGGER tr_A_i ON dbo.A
FOR INSERT
AS
INSERT dbo.B
SELECT id, c1, GETDATE()
FROM INSERTED
GO

INSERT dbo.A VALUES (1, 'Luca')
INSERT dbo.A VALUES (2, 'Lorenzo')
INSERT dbo.A VALUES (3, 'Andrea')
GO

DELETE dbo.A WHERE id = 1
GO
=========================

e successivamente modificando la struttura della tabella dbo.A da EM lo script che viene generato "dietro le quinte" comprende entrambi i trigger che ho creato senza avergli preventivamente detto che erano 2. Quello che segue è lo script risultante a testimonianza del fatto che quello che ti dico è vero...

=========================
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
CREATE TABLE dbo.Tmp_A
(
id smallint NOT NULL,
c0 varchar(10) NULL,
c1 varchar(50) NOT NULL
) ON [PRIMARY]
GO
IF EXISTS(SELECT * FROM dbo.A)
EXEC('INSERT INTO dbo.Tmp_A (id, c1)
SELECT id, c1 FROM dbo.A (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.A
GO
EXECUTE sp_rename N'dbo.Tmp_A', N'A', 'OBJECT'
GO
CREATE TRIGGER tr_A_d ON dbo.A
FOR DELETE
AS
INSERT dbo.B
SELECT id, c1, GETDATE()
FROM DELETED
GO
CREATE TRIGGER tr_A_i ON dbo.A
FOR INSERT
AS
INSERT dbo.B
SELECT id, c1, GETDATE()
FROM INSERTED
GO
COMMIT
=========================

Bye
77 messaggi dal 09 ottobre 2001
in effetti riprovando lo script generato mi inserisce gli eventuali trigger.
Xò io devo fare uno script generico che mi aggiorni la tabella preservando i trigger e gli indici senza sapere a priori quali e quanti ce ne sono sulla tabella stessa...

Andrea

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.