Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Tomek - 24-12-2006 00:38 Zagadka, rekrutacja
Witam Pewna firma szuka programisty sql i umiescila w sieci taka zagadke: Trzeba znaleźć błąd. I tylko tyle. Ja sie poddałem, jeszcze jestem za "miętki" Miłej zabawy. Pozdrawiam
CREATE TABLE [Users] ( [Uid] [int] IDENTITY(1, 1) NOT NULL, [Name] [nvarchar](50) NOT NULL, [Address] [nvarchar](50) NOT NULL, CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([Uid] ASC)) GO
CREATE TABLE [Logs] ( [LogID] [int] IDENTITY(1, 1) NOT NULL, [Date] [datetime] NOT NULL, [Uid] [int] NOT NULL, CONSTRAINT [PK_Logs] PRIMARY KEY CLUSTERED ([LogID] ASC)) GO
CREATE TRIGGER [LogUsersInsert] ON [Users] AFTER INSERT AS DECLARE @uid int SELECT @uid = Uid FROM INSERTED INSERT INTO [Logs]([Date], [Uid]) VALUES (GETDATE(), @uid) GO
CREATE PROCEDURE InsertUser @name NVARCHAR(50), @address NVARCHAR(50), @userID INT OUTPUT AS INSERT INTO [Users]([Name], [Address]) VALUES (@name, @address) SELECT @userID = @@IDENTITY GO
> Niedawno ktoś o tym pisał na grupie: > SELECT @uid = Uid FROM INSERTED
Drobne uchylenie dobrych zasad znajdujące się w trigerze w porównaniu z ktytycznym błedem w procedurze to drobiazg. Biorąc pod uwage sposób wypełnania tabeli [Users] sugerujacy iż wpisywany będzie do niej w jednym query tylko jeden wiersz. -- ____________ Robert Winkler
zarafiq@poczta.onet.pl - 24-12-2006 00:38
> > Niedawno ktoś o tym pisał na grupie: > > SELECT @uid = Uid FROM INSERTED > > Drobne uchylenie dobrych zasad znajdujące się w trigerze > w porównaniu z ktytycznym błedem w procedurze to drobiazg. > Biorąc pod uwage sposób wypełnania tabeli [Users] > sugerujacy iż wpisywany będzie do niej w jednym query tylko jeden wiersz.
Hmm... przyznam że tam nic nie widzę, Microsoft zaleca używać SET zamiast SELECT ale chyba nie nazwałbyś tego błędem krytycznym.
> Sam sobie odpowiem :) > @@IDENTITY zwróci wartość IDENTITY rekordu wstawionego przez TRIGGER :)
Gratuluje, Dlatego w T-SQL'u nie stosuje się już @@IDENTITY tylko SCOPE_IDENTITY() SET @userID = SCOPE_IDENTITY()
a triger: CREATE TRIGGER [LogUsersInsert] ON [Users] AFTER INSERT AS SET NOCOUNT ON DECLARE @insertData DATE SET @insertData = GETDATE() INSERT INTO [Logs]([Date], [Uid]) SELECT @insertData, Uid FROM INSERTED GO
Prawda że proste.
-- ____________ Robert Winkler
Maciej Łuszczyński - 24-12-2006 00:38
> Witam > Pewna firma szuka programisty sql i umiescila w sieci taka zagadke: > Trzeba znaleźć błąd. I tylko tyle. Ja sie poddałem, jeszcze jestem za "miętki" > Miłej zabawy. Pozdrawiam > > CREATE TABLE [Users] ( > [Uid] [int] IDENTITY(1, 1) NOT NULL, > [Name] [nvarchar](50) NOT NULL, > [Address] [nvarchar](50) NOT NULL, > CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([Uid] ASC)) > GO > > CREATE TABLE [Logs] ( > [LogID] [int] IDENTITY(1, 1) NOT NULL, > [Date] [datetime] NOT NULL, > [Uid] [int] NOT NULL, > CONSTRAINT [PK_Logs] PRIMARY KEY CLUSTERED ([LogID] ASC)) > GO > > CREATE TRIGGER [LogUsersInsert] ON [Users] AFTER INSERT AS > DECLARE @uid int > SELECT @uid = Uid FROM INSERTED > INSERT INTO [Logs]([Date], [Uid]) VALUES (GETDATE(), @uid) > GO > > CREATE PROCEDURE InsertUser > @name NVARCHAR(50), > @address NVARCHAR(50), > @userID INT OUTPUT > AS > INSERT INTO [Users]([Name], [Address]) > VALUES (@name, @address) > SELECT @userID = @@IDENTITY > GO
Fajne.
Obstawiam bledna wartosc w zmiennej @UserID - @@IDENTITY przejmie wartosc z rekordu dodanego do logu (trigger jest after insert). Zamiast @@IDENTITY polecam stosowac SCOPE_IDENTITY() - mniej od tego boli glowa.
To co, dostane ta robote ;)
Pozdrawiam Maciek -- *** A czym się różni Cray od normalnego peceta? *** Tym, że Cray wykonuje pętle nieskończone w 10 sekund.
Jacek Stawicki - 24-12-2006 00:38
Użytkownik "Tomek" <tomasz_123@NOSPAM.gazeta.pl> napisał w wiadomości news:embn4o$9ir$1@inews.gazeta.pl... > Witam > Pewna firma szuka programisty sql i umiescila w sieci taka zagadke: > Trzeba znaleźć błąd. I tylko tyle. Ja sie poddałem, jeszcze jestem za > "miętki" > Miłej zabawy. Pozdrawiam
> CREATE PROCEDURE InsertUser > @name NVARCHAR(50), > @address NVARCHAR(50), > @userID INT OUTPUT > AS > INSERT INTO [Users]([Name], [Address]) > VALUES (@name, @address) > SELECT @userID = @@IDENTITY > GO
parsujac w "glowie", zamiast SELECT @userID = @@IDENTITY uzyc SELECT @userID = scope_IDENTITY() ?
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona