2011-12-01 96 views
0

我剛剛將我的一個頁面轉移到Windows Azure帳戶。一切都順利..直到我試圖創建一些數據。我的觸發器,它工作得很好用MSSQL2008未能在Azure上 - 我怎麼能解決這個觸發器:在這個觸發SQL Server輸入觸發器到天青觸發器

CREATE TRIGGER creator 
ON someTable 
FOR INSERT 
AS 
DECLARE @someTableID INT; 
SELECT @someTableID=(SELECT someTableID FROM INSERTED) 
INSERT INTO Preisgruppe (Name, someTableID, UserPreisgruppe_ID) VALUES ('Gast',  @someTableID, 1) 
INSERT INTO Oeffnungszeit (someTableID, Tag_ID, von,bis) VALUES (@someTableID, 0,  '00:00','00:00'),(@someTableID, 1, '00:00','00:00'),(@someTableID, 2, '00:00','00:00'),( @someTableID, 3, '00:00','00:00'),(@someTableID, 4, '00:00','00:00'),(@someTableID, 5,  '00:00','00:00'),(@someTableID, 6, '00:00','00:00') 
GO 
+0

你是怎樣嘗試插入數據?如果您一次插入多行,則該觸發器將失敗。 – Gixonita

+2

觸發器失敗的方式是什麼?請在你的文章中詳細說明。 –

+0

錯誤meesage將有助於理解問題 –

回答

0

沒有什麼是面色不善。 我沒有嘗試過你的代碼,它工作正常。 所以它可能是結構。我是這樣的:

CREATE TABLE [dbo].[someTable](
    [someTableID] [int] IDENTITY(1,1) NOT NULL, 
    [Column1] [nvarchar](50) NOT NULL 
) 

CREATE TABLE [dbo].[Preisgruppe](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](50) NULL, 
    [someTableID] [int] NULL, 
    [UserPreisgruppe_ID] [int] NULL 
) 

CREATE TABLE [dbo].[Oeffnungszeit](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [someTableID] [int] NOT NULL, 
    [Tag_ID] [int] NOT NULL, 
    [von] [time](7) NULL, 
    [bis] [time](7) NULL 
) 

而且它可能是不錯的錯誤信息......

0

只是提供另一個例子,這裏是我使用...

表定義:
這只是一個普通表,除了AUDIT字段的「主體」在HISTORY表中。

CREATE TABLE [data].[Categories](
    [Id] [uniqueidentifier] NOT NULL DEFAULT (newid()), 
    [Name] [nvarchar](250) NOT NULL, 
    [Description] [nvarchar](500) NULL, 
    [DisplayOrder] [bigint] NULL, 
    [ProductCount] [bigint] NULL, 
    [IsActive] [bit] NOT NULL CONSTRAINT [DF_Categories_IsActive] DEFAULT ((1)), 
    [UpdatedBy] [nvarchar](360) NOT NULL 
) 

在一個側面說明...

  • 堆表是不允許的,所以讓每一個「ID」列的主
  • 你也應該習慣使用GUID對您的PRIMARY KEY的

歷史表定義(用於審計目的):
此表用於AUDI T的目的。你仍然可以看到誰在什麼時間做什麼,除了現在,歷史沒有被埋在你的主表中,也不會減慢你的INDEXES。而且......你獲得真正的審計超越了單純的日誌傳送。

CREATE TABLE [history].[data_Categories](
    [Id] [uniqueidentifier] NOT NULL DEFAULT (newid()), 
    [EntityId] [uniqueidentifier] NOT NULL, 
    [Name] [nvarchar](250) NOT NULL, 
    [Description] [nvarchar](500) NULL, 
    [ProductCount] [bigint] NULL, 
    [DisplayOrder] [bigint] NULL, 
    [IsActive] [bit] NOT NULL, 
    [UpdatedBy] [nvarchar](360) NOT NULL, 
    [UpdateType] [nvarchar](50) NOT NULL, 
    [UpdatedDate] [datetime] NOT NULL 
) 

GO 

ALTER TABLE [history].[data_Categories] ADD CONSTRAINT [DF_data_Categories_31EC6D26] DEFAULT (newid()) FOR [Id] 
GO 

ALTER TABLE [history].[data_Categories] ADD CONSTRAINT [DF_data_Categories_32E0915F] DEFAULT (getutcdate()) FOR [UpdatedDate] 
GO 

ALTER TABLE [history].[data_Categories] ADD DEFAULT ('00000000-0000-0000-0000-000000000000') FOR [EntityId] 
GO 

在一個側面說明...

  • 您也可以關閉在刪除存儲過程的觸發器使審計「清潔」
  • 變得「乾淨」的原因你得到一個DELETE AUDIT記錄而不是UPDATE & DELETE AUDIT記錄
  • 要做到這一點,只需在DELETE STATEMENT之前關閉TRIGGER,然後再打開它。

表觸發器:
只是一個普通的觸發...

CREATE TRIGGER [data].[trig_Categories] 
    ON [data].[Categories] 
    AFTER INSERT, DELETE, UPDATE 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    DECLARE @Id INT 
    DECLARE @Type VARCHAR(20); 

    IF EXISTS(SELECT * FROM INSERTED) 
     BEGIN 
      IF EXISTS(SELECT * FROM DELETED) 
       BEGIN 
        SET @Type ='UPDATED'; 
       END 
      ELSE 
       BEGIN 
        SET @Type ='INSERTED'; 
       END 


      INSERT INTO 
       history.data_Categories (
        [EntityId] 
        ,[Name] 
        ,[Description] 
        ,[DisplayOrder] 
        ,[ProductCount] 
        ,[IsActive] 
        ,[UpdatedBy] 
        ,[UpdateType]) 
      SELECT 
        [Id] 
        ,[Name] 
        ,[Description] 
        ,[DisplayOrder] 
        ,[ProductCount] 
        ,[IsActive] 
        ,[UpdatedBy] 
        ,@Type 
      FROM INSERTED 

     END 
    ELSE 
     BEGIN 
      SET @type = 'DELETED'; 


      INSERT INTO 
       history.data_Categories (
        [EntityId] 
        ,[Name] 
        ,[Description] 
        ,[DisplayOrder] 
        ,[ProductCount] 
        ,[IsActive] 
        ,[UpdatedBy] 
        ,[UpdateType]) 
      SELECT 
        [Id] 
        ,[Name] 
        ,[Description] 
        ,[DisplayOrder] 
        ,[ProductCount] 
        ,[IsActive] 
        ,[UpdatedBy] 
        ,@Type   
      FROM DELETED 
     END; 
END 

GO