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

#1 Alejandro Mesa
08/03/2010 - 00:10 | Informe spam
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

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
#2 Bartolomé Genovard
08/03/2010 - 11:25 | Informe spam
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

> 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
#3 Miguel Egea
08/03/2010 - 11:32 | Informe spam
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 Mentos
http://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

> 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
#4 Alejandro Mesa
08/03/2010 - 15:48 | Informe spam
Bartolomé Genovard,

Hombre, tu mismos lo has dicho en tu post original.

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



No importa si el trigger no hace referencia a estas columnas, pues lo mismo
ha de ser en la sentencias que disparan al trigger. No se puede referenciar
una columna calculada en una sentencia insert, no importa si tienes un
trigger "instead of" en la tabla / vista para cambiar el destino.

Lo mismo pasa con las columnas identity. Si tienes pencendida la opcion
"identity_insert" entonces debes referenciar la columna, pero si esta apagada
no debes referenciarla en la sentencia insert, aunque tengas un trigger
"instead of".


AMB




"Bartolomé Genovard" wrote:

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
>
> > 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
#5 Bartolomé Genovard
08/03/2010 - 16:18 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida