Trigger instide of Insert ... no funciona

07/03/2010 - 21:50 por Bartolomé Genovard | Informe spam
HOla

como en mi tabla tengo uncampo calculado, he creado un trigger para
que me modifique el insert y excluya el campo calculado y el ID.

El trigger es:

create TRIGGER [dbo].[mi_trigger] ON [dbo].[t_tabla1]
INSTEAD OF INSERT
AS
BEGIN

insert into t_tabla1 (campo1, campo2, campo3)
Select campo1, campo2, campo3
FROM inserted
END

si hago un insert sql incluyendo en la sentencia insert el campo
calculado y el id, me salta el error...

Msg 271, Level 16, State 1, Line 5
The column "cc_grupo" cannot be modified because it is either a
computed column or is the result of a UNION operator.

no entiendo nada

¿como puedo ver si realmente se dispara el trigger?

gracias

Preguntas similare

Leer las respuestas

#6 Miguel Egea
08/03/2010 - 16:36 | Informe spam
entendido, si no puedes (que yo creo que si se puede) modificar como lo hace
.NET, lo que debes hacer es crearte una vista sin el campo calculado y
tratarla como si fuese tu tabla...

Eso funciona fijo

Saludos Cordiales
Miguel Egea
Solid Quality Mentos
http://www.portalsql.com

"Bartolomé Genovard" escribió en el mensaje de
noticias:
On 8 mar, 11:32, "Miguel Egea" wrote:
Nos puedes poner que estas haciendo exactamente, es que no veo como te
puede
pasar, este código funciona perfectamente en SQL Server 2008 (supongo que
también en 2005)
create table t (id int identity (1,1) not null primary key, a int, b
int, c
as a+b)
go
insert into t values (1,2)

Saludos Cordiales
Miguel Egea
Solid Quality Mentoshttp://www.portalsql.com

"Bartolomé Genovard" escribió en el mensaje de
noticias:

> Hola,

> pues mis inserts no hacen referencia ni al ID ni a la columan
> calculada y salta el error de que no puede modificar la columna
> calculada, entiendo qeu el trigger no se dispara y hace el insert
> 'normal'... no se que mas mirar...

> On 8 mar, 00:10, Alejandro Mesa
> wrote:
>> Bartolomé Genovard,

>> Existen chequeos de metadata y restricciones que se hacen antes de que
>> algun
>> trigger sea ejecutado. En esos casos tenemos referencia a una columna
>> calculada en la sentencia insert, referencia a una columna identity en
>> la
>> sentencia insert, si no esta encendida la opcion "identity_insert". Lo
>> mismo
>> pasa si la opcion "identity_insert" esta prendida pero no se hace una
>> referencia explicita a la columna identity en la sentencia insert.

>> Tu trigger "instead of" ha de funcionar ok si la sentencia que lo
>> dispara
>> esta correcta, que en este caso seria no referenciar a la columna
>> identity ni
>> la calculada.

>> Ejemplo:

>> USE tempdb;
>> GO
>> CREATE TABLE dbo.T (
>> c1 int NOT NULL IDENTITY(1, 1),
>> c2 AS (c1 % 3),
>> c3 char(1) NULL
>> );
>> GO
>> CREATE TRIGGER dbo.tr_T_io_Ins ON dbo.T
>> INSTEAD OF INSERT
>> AS
>> IF @@rowcount = 0
>> RETURN;

>> INSERT INTO dbo.T(c3)
>> SELECT c3
>> FROM INSERTED;
>> GO
>> INSERT INTO dbo.T (c3) VALUES('A');
>> INSERT INTO dbo.T (c3) VALUES('B');
>> INSERT INTO dbo.T (c3) VALUES('C');
>> INSERT INTO dbo.T (c3) VALUES('D');
>> GO
>> SELECT * FROM dbo.T;
>> GO
>> SET IDENTITY_INSERT dbo.T ON;
>> GO
>> INSERT INTO dbo.T (c3) VALUES('E');
>> GO
>> SELECT * FROM dbo.T;
>> GO
>> DROP TABLE dbo.T;
>> GO

>> AMB

>> "Bartolomé Genovard" wrote:
>> > HOla

>> > como en mi tabla tengo uncampo calculado, he creado un trigger para
>> > que me modifique el insert y excluya el campo calculado y el ID.

>> > El trigger es:

>> > create TRIGGER [dbo].[mi_trigger] ON [dbo].[t_tabla1]
>> > INSTEAD OF INSERT
>> > AS
>> > BEGIN

>> > insert into t_tabla1 (campo1, campo2, campo3)
>> > Select campo1, campo2, campo3
>> > FROM inserted
>> > END


HOla,

gracias por tu tiempo. A ver si lo aclaro:

Tengo una tabla, digamos que (ojo, he traducido los campos para que sa
mas facil, espero no haberme colado):


CREATE TABLE [dbo].[t_tabla1](
[campo1] [nchar(10)] NOT NULL,
[campo2] [nchar(10)] NOT NULL,
[campo3] [datetime] NOT NULL,
[id_campo] [int] IDENTITY(1,1) NOT NULL,
[campo_cc] AS ([dbo].[fn_grupo_Categoria_Persona_Curso]([campo2])),

CONSTRAINT [PK_id_campo] PRIMARY KEY CLUSTERED
(
[id_campo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY
= OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


Puesto que mi aplicación esta en VB.net, al modificar un registro de
la tabla t_tabla1, me hace un insert para todos los campos, incluidos
el campo ID y sobretodo, y lo que provoca el fallo del campo_cc (campo
calculado); me salta el error:

Msg 271, Level 16, State 1, Line 5
The column "cc_grupo" cannot be modified because it is either a
computed column or is the result of a UNION operator.



Para evitar este error me cree un trigger para los inserts (luego me
haré otro para los updates) para que el insert se transforme en un
insert que no incluya el campo calculado..., y lo he hecho así:

create TRIGGER [dbo].[mi_trigger] ON [dbo].[t_tabla1]
INSTEAD OF INSERT
AS
BEGIN

insert into t_tabla1 (campo1, campo2, campo3)
Select campo1, campo2, campo3
FROM inserted
END

Pero el tema es que me sigue saltando el mismo error... :(


>> > si hago un insert sql incluyendo en la sentencia insert el campo
>> > calculado y el id, me salta el error...

>> > Msg 271, Level 16, State 1, Line 5
>> > The column "cc_grupo" cannot be modified because it is either a
>> > computed column or is the result of a UNION operator.

>> > no entiendo nada

>> > ¿como puedo ver si realmente se dispara el trigger?

>> > gracias
>> > .



Respuesta Responder a este mensaje
#7 Alejandro Mesa
08/03/2010 - 17:47 | Informe spam
Bartolomé Genovard,

Como comento Miguel, deberas cambiar tu aplicacion .Net para que use los
comandos adecuados.

Aca tienes un ejemplo de como cambiar los comandos insert / update de una
instancia del objeto sqladapter.

SqlDataAdapter.UpdateCommand Property
http://msdn.microsoft.com/en-us/lib...mmand.aspx


AMB


"Bartolomé Genovard" wrote:

On 8 mar, 11:32, "Miguel Egea" wrote:
> Nos puedes poner que estas haciendo exactamente, es que no veo como te puede
> pasar, este código funciona perfectamente en SQL Server 2008 (supongo que
> también en 2005)
> create table t (id int identity (1,1) not null primary key, a int, b int, c
> as a+b)
> go
> insert into t values (1,2)
>
> Saludos Cordiales
> Miguel Egea
> Solid Quality Mentoshttp://www.portalsql.com
>
> "Bartolomé Genovard" escribió en el mensaje de
> noticias:
>
> > Hola,
>
> > pues mis inserts no hacen referencia ni al ID ni a la columan
> > calculada y salta el error de que no puede modificar la columna
> > calculada, entiendo qeu el trigger no se dispara y hace el insert
> > 'normal'... no se que mas mirar...
>
> > On 8 mar, 00:10, Alejandro Mesa
> > wrote:
> >> Bartolomé Genovard,
>
> >> Existen chequeos de metadata y restricciones que se hacen antes de que
> >> algun
> >> trigger sea ejecutado. En esos casos tenemos referencia a una columna
> >> calculada en la sentencia insert, referencia a una columna identity en la
> >> sentencia insert, si no esta encendida la opcion "identity_insert". Lo
> >> mismo
> >> pasa si la opcion "identity_insert" esta prendida pero no se hace una
> >> referencia explicita a la columna identity en la sentencia insert.
>
> >> Tu trigger "instead of" ha de funcionar ok si la sentencia que lo dispara
> >> esta correcta, que en este caso seria no referenciar a la columna
> >> identity ni
> >> la calculada.
>
> >> Ejemplo:
>
> >> USE tempdb;
> >> GO
> >> CREATE TABLE dbo.T (
> >> c1 int NOT NULL IDENTITY(1, 1),
> >> c2 AS (c1 % 3),
> >> c3 char(1) NULL
> >> );
> >> GO
> >> CREATE TRIGGER dbo.tr_T_io_Ins ON dbo.T
> >> INSTEAD OF INSERT
> >> AS
> >> IF @@rowcount = 0
> >> RETURN;
>
> >> INSERT INTO dbo.T(c3)
> >> SELECT c3
> >> FROM INSERTED;
> >> GO
> >> INSERT INTO dbo.T (c3) VALUES('A');
> >> INSERT INTO dbo.T (c3) VALUES('B');
> >> INSERT INTO dbo.T (c3) VALUES('C');
> >> INSERT INTO dbo.T (c3) VALUES('D');
> >> GO
> >> SELECT * FROM dbo.T;
> >> GO
> >> SET IDENTITY_INSERT dbo.T ON;
> >> GO
> >> INSERT INTO dbo.T (c3) VALUES('E');
> >> GO
> >> SELECT * FROM dbo.T;
> >> GO
> >> DROP TABLE dbo.T;
> >> GO
>
> >> AMB
>
> >> "Bartolomé Genovard" wrote:
> >> > HOla
>
> >> > como en mi tabla tengo uncampo calculado, he creado un trigger para
> >> > que me modifique el insert y excluya el campo calculado y el ID.
>
> >> > El trigger es:
>
> >> > create TRIGGER [dbo].[mi_trigger] ON [dbo].[t_tabla1]
> >> > INSTEAD OF INSERT
> >> > AS
> >> > BEGIN
>
> >> > insert into t_tabla1 (campo1, campo2, campo3)
> >> > Select campo1, campo2, campo3
> >> > FROM inserted
> >> > END
HOla,

gracias por tu tiempo. A ver si lo aclaro:

Tengo una tabla, digamos que (ojo, he traducido los campos para que sa
mas facil, espero no haberme colado):


CREATE TABLE [dbo].[t_tabla1](
[campo1] [nchar(10)] NOT NULL,
[campo2] [nchar(10)] NOT NULL,
[campo3] [datetime] NOT NULL,
[id_campo] [int] IDENTITY(1,1) NOT NULL,
[campo_cc] AS ([dbo].[fn_grupo_Categoria_Persona_Curso]([campo2])),

CONSTRAINT [PK_id_campo] PRIMARY KEY CLUSTERED
(
[id_campo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY
= OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


Puesto que mi aplicación esta en VB.net, al modificar un registro de
la tabla t_tabla1, me hace un insert para todos los campos, incluidos
el campo ID y sobretodo, y lo que provoca el fallo del campo_cc (campo
calculado); me salta el error:

Msg 271, Level 16, State 1, Line 5
The column "cc_grupo" cannot be modified because it is either a
computed column or is the result of a UNION operator.



Para evitar este error me cree un trigger para los inserts (luego me
haré otro para los updates) para que el insert se transforme en un
insert que no incluya el campo calculado..., y lo he hecho así:

create TRIGGER [dbo].[mi_trigger] ON [dbo].[t_tabla1]
INSTEAD OF INSERT
AS
BEGIN

insert into t_tabla1 (campo1, campo2, campo3)
Select campo1, campo2, campo3
FROM inserted
END

Pero el tema es que me sigue saltando el mismo error... :(

>
> >> > si hago un insert sql incluyendo en la sentencia insert el campo
> >> > calculado y el id, me salta el error...
>
> >> > Msg 271, Level 16, State 1, Line 5
> >> > The column "cc_grupo" cannot be modified because it is either a
> >> > computed column or is the result of a UNION operator.
>
> >> > no entiendo nada
>
> >> > ¿como puedo ver si realmente se dispara el trigger?
>
> >> > gracias
> >> > .

.

Respuesta Responder a este mensaje
#8 Bartolomé Genovard
08/03/2010 - 18:55 | Informe spam
HOla,

lo de la vista no me vale, pq precisamente tengo el campo calculado
para usarlo en mis formularios, si lo quito ...

Ya lo solucioné, en el dataset, me ido al table adapter de mi tabla y
me modificado los comandos insert y update quitando el campo
calculado. Supongo que no hay propiedad que se pueda definir en el
campo para que luego Vb al crear el dataset lo excluya, no? Pq así
ahora tengo que estar siempre pendiente que modifiqeu el dataset que
vb no me lo vuelva a incluir.

gracias

On 8 mar, 17:47, Alejandro Mesa
wrote:
Bartolomé Genovard,

Como comento Miguel, deberas cambiar tu aplicacion .Net para que use los
comandos adecuados.

Aca tienes un ejemplo de como cambiar los comandos insert / update de una
instancia del objeto sqladapter.

SqlDataAdapter.UpdateCommand Propertyhttp://msdn.microsoft.com/e...sqldata...

AMB

"Bartolomé Genovard" wrote:
> On 8 mar, 11:32, "Miguel Egea" wrote:
> > Nos puedes poner que estas haciendo exactamente, es que no veo como te puede
> > pasar, este código funciona perfectamente en SQL Server 2008 (supongo que
> > también en 2005)
> >  create table t (id int identity (1,1) not null primary key, a int, b int, c
> > as a+b)
> >  go
> >  insert into t  values (1,2)

> > Saludos Cordiales
> > Miguel Egea
> > Solid Quality Mentoshttp://www.portalsql.com

> > "Bartolomé Genovard" escribió en el mensaje de
> > noticias:

> > > Hola,

> > > pues mis inserts no hacen referencia ni al ID ni a la columan
> > > calculada y salta el error de que no puede modificar la columna
> > > calculada, entiendo qeu el trigger no se dispara y hace el insert
> > > 'normal'... no se que mas mirar...

> > > On 8 mar, 00:10, Alejandro Mesa
> > > wrote:
> > >> Bartolomé Genovard,

> > >> Existen chequeos de metadata y restricciones que se hacen antes de que
> > >> algun
> > >> trigger sea ejecutado. En esos casos tenemos referencia a una columna
> > >> calculada en la sentencia insert, referencia a una columna identity en la
> > >> sentencia insert, si no esta encendida la opcion "identity_insert". Lo
> > >> mismo
> > >> pasa si la opcion "identity_insert" esta prendida pero no se hace una
> > >> referencia explicita a la columna identity en la sentencia insert.

> > >> Tu trigger "instead of" ha de funcionar ok si la sentencia que lo dispara
> > >> esta correcta, que en este caso seria no referenciar a la columna
> > >> identity ni
> > >> la calculada.

> > >> Ejemplo:

> > >> USE tempdb;
> > >> GO
> > >> CREATE TABLE dbo.T (
> > >> c1 int NOT NULL IDENTITY(1, 1),
> > >> c2 AS (c1 % 3),
> > >> c3 char(1) NULL
> > >> );
> > >> GO
> > >> CREATE TRIGGER dbo.tr_T_io_Ins ON dbo.T
> > >> INSTEAD OF INSERT
> > >> AS
> > >> IF @@rowcount = 0
> > >>     RETURN;

> > >> INSERT INTO dbo.T(c3)
> > >> SELECT c3
> > >> FROM INSERTED;
> > >> GO
> > >> INSERT INTO dbo.T (c3) VALUES('A');
> > >> INSERT INTO dbo.T (c3) VALUES('B');
> > >> INSERT INTO dbo.T (c3) VALUES('C');
> > >> INSERT INTO dbo.T (c3) VALUES('D');
> > >> GO
> > >> SELECT * FROM dbo.T;
> > >> GO
> > >> SET IDENTITY_INSERT dbo.T ON;
> > >> GO
> > >> INSERT INTO dbo.T (c3) VALUES('E');
> > >> GO
> > >> SELECT * FROM dbo.T;
> > >> GO
> > >> DROP TABLE dbo.T;
> > >> GO

> > >> AMB

> > >> "Bartolomé Genovard" wrote:
> > >> > HOla

> > >> > como en mi tabla tengo uncampo calculado, he creado un trigger para
> > >> > que me modifique el insert y excluya el campo calculado y el ID.

> > >> > El trigger es:

> > >> > create TRIGGER [dbo].[mi_trigger] ON [dbo].[t_tabla1]
> > >> > INSTEAD OF INSERT
> > >> > AS
> > >> > BEGIN

> > >> >    insert into t_tabla1 (campo1, campo2, campo3)
> > >> >       Select      campo1, campo2, campo3
> > >> >    FROM  inserted
> > >> > END
> HOla,

> gracias por tu tiempo. A ver si lo aclaro:

> Tengo una tabla, digamos que (ojo, he traducido los campos para que sa
> mas facil, espero no haberme colado):

> CREATE TABLE [dbo].[t_tabla1](
>    [campo1] [nchar(10)] NOT NULL,
>    [campo2] [nchar(10)] NOT NULL,
>    [campo3] [datetime] NOT NULL,
>    [id_campo] [int] IDENTITY(1,1) NOT NULL,
>    [campo_cc]  AS ([dbo].[fn_grupo_Categoria_Persona_Curso]([campo2])),

>  CONSTRAINT [PK_id_campo] PRIMARY KEY CLUSTERED
> (
>    [id_campo] ASC
> )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY
> = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
> ) ON [PRIMARY]


> Puesto que mi aplicación esta en VB.net, al modificar un registro de
> la tabla t_tabla1, me hace un insert para todos los campos, incluidos
> el campo ID y sobretodo, y lo que provoca el fallo del campo_cc (campo
> calculado); me salta el error:

> Msg 271, Level 16, State 1, Line 5
> The column "cc_grupo" cannot be modified because it is either a
> computed column or is the result of a UNION operator.

>

> Para evitar este error me cree un trigger para los inserts (luego me
> haré otro para los updates) para que el insert se transforme en un
> insert que no incluya el campo calculado..., y lo he hecho así:

> create TRIGGER [dbo].[mi_trigger] ON [dbo].[t_tabla1]
> INSTEAD OF INSERT
> AS
> BEGIN

>    insert into t_tabla1 (campo1, campo2, campo3)
>       Select      campo1, campo2, campo3
>    FROM  inserted
> END

> Pero el tema es que me sigue saltando el mismo error... :(

> > >> > si hago un insert sql incluyendo en la sentencia insert el campo
> > >> > calculado y el id, me salta el error...

> > >> > Msg 271, Level 16, State 1, Line 5
> > >> > The column "cc_grupo" cannot be modified because it is either a
> > >> > computed column or is the result of a UNION operator.

> > >> > no entiendo nada

> > >> > ¿como puedo ver si realmente se dispara el trigger?

> > >> > gracias
> > >> > .

> .
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida