Trigger mit Bedingung (kompliziert)

08/11/2007 - 15:26 von Stefan Simon | Report spam
Hallo,

ich habe eine Tabelle tbl_1 mit verschiedenen Codes und eine Tabelle tbl_2,
in der eine Auflistung einiger Codes aus tbl_1 gespeichert werden soll,
allerdings nur dann, wenn die Codes auch wirklich in tbl_1 vorhanden sind.

Also ungefàhr so:

\\\
create database TestDB collate Latin1_General_CS_AS

use TestDB
go

Create Table tbl_1
( Code varchar(10)
)

Create Table tbl_2
( CodeListe varchar(30)
)

if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].TR_Trigger')
and OBJECTPROPERTY(id, N'IsTrigger') = 1)
drop trigger [dbo].TR_Trigger
GO

CREATE trigger TR_Trigger on tbl_2 for insert
as
if (select count(*) from inserted)>0
begin
if not [alle kommagetrennten Werte in tbl_1.Codes]
(rollback)
end
go
///

Testwerte
\\\
insert into tbl_1 (Code)
select 'Code1' union
select 'Code2' union
select 'Code3'
///

Wie kann ich nun erreichen, das folgender Befehl ausgeführt wird (weil Code1
und Code2 vorhanden sind)

insert into tbl_2 (CodeListe)
select 'Code1, Code2'

und folgender Befehl abgebrochen wird (weil Code4 fehlt)

insert into tbl_2 (CodeListe)
select 'Code3, Code4'

Ich bekomme die Auflistung einfach nicht getrennt und auf Gültigkeit
überprüft. Kann da jemand helfen?

tia
Stefan
 

Lesen sie die antworten

#1 Frank Kalis
08/11/2007 - 16:04 | Warnen spam
"Stefan Simon" wrote:

ich habe eine Tabelle tbl_1 mit verschiedenen Codes und eine Tabelle tbl_2,
in der eine Auflistung einiger Codes aus tbl_1 gespeichert werden soll,
allerdings nur dann, wenn die Codes auch wirklich in tbl_1 vorhanden sind.

Also ungefàhr so:

\\\
create database TestDB collate Latin1_General_CS_AS

use TestDB
go

Create Table tbl_1
( Code varchar(10)
)

Create Table tbl_2
( CodeListe varchar(30)
)

if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].TR_Trigger')
and OBJECTPROPERTY(id, N'IsTrigger') = 1)
drop trigger [dbo].TR_Trigger
GO

CREATE trigger TR_Trigger on tbl_2 for insert
as
if (select count(*) from inserted)>0
begin
if not [alle kommagetrennten Werte in tbl_1.Codes]
(rollback)
end
go
///

Testwerte
\\\
insert into tbl_1 (Code)
select 'Code1' union
select 'Code2' union
select 'Code3'
///

Wie kann ich nun erreichen, das folgender Befehl ausgeführt wird (weil Code1
und Code2 vorhanden sind)

insert into tbl_2 (CodeListe)
select 'Code1, Code2'

und folgender Befehl abgebrochen wird (weil Code4 fehlt)

insert into tbl_2 (CodeListe)
select 'Code3, Code4'

Ich bekomme die Auflistung einfach nicht getrennt und auf Gültigkeit
überprüft. Kann da jemand helfen?




DROP TABLE tbl_1, tbl_2
Create Table tbl_1
( Code varchar(10)
)

Create Table tbl_2
( CodeListe varchar(30)
)

if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].TR_Trigger')
and OBJECTPROPERTY(id, N'IsTrigger') = 1)
drop trigger [dbo].TR_Trigger
GO

CREATE trigger TR_Trigger on tbl_2 for insert
as
IF @@ROWCOUNT=1
begin
DECLARE @s varchar(MAX)

SELECT @s = CodeListe +',' FROM inserted

IF EXISTS(
SELECT *
FROM
(SELECT RIGHT(LEFT(@s,Number-1),CHARINDEX(',',REVERSE(LEFT(',
'+@s,Number-1)))) AS splitter
FROM master..spt_values
WHERE Type = 'P' AND Number BETWEEN 1 AND LEN(@s)
AND SUBSTRING(@s,Number,1) = ',' AND SUBSTRING(@s,Number-1,1) <>
',') x
LEFT JOIN tbl_1
ON tbl_1.Code = x.splitter
WHERE tbl_1.Code IS NULL)
BEGIN
ROLLBACK TRAN
END
end
go


insert into tbl_1 (Code)
select 'Code1' union
select 'Code2' union
select 'Code3'

insert into tbl_2 (CodeListe) select 'Code3, Code4'


sollte funktionieren. Allerdings kann dieser Trigger nur mit dem Einfügen
jeweils eines Datensatzes umgehen. Falls mehr als einer in einer Transaktion
eingefügt werden sollen, muß das dementsprechend angepasst werden. Ich würde
allerdings auch mal diesen Artikel genau durchlesen:
http://www.sommarskog.se/arrays-in-sql.html
Frank Kalis
Microsoft SQL Server MVP
Webmaster: http://www.insidesql.de

Ähnliche fragen