我刚刚把我的一个页面转移到Windows Azure帐户。一切都很顺利。直到我试图创建一些数据。我的触发器,在MSSQL2008上工作得很好,在azure上失败了-我该如何修复这个触发器:
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
这个触发器看起来没什么不好的。我确实试过你的代码,它工作得很好。所以它可能是结构。我是这样的:
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
)
也可以有错误信息…
只是提供另一个例子,这里是我使用的…
表定义:
这只是一个普通的表,只是审计字段的"主体"在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"列PRIMARY
- 你也应该习惯使用GUID的主键
历史表定义(用于审计):
该表用于审计目的。你仍然可以看到谁做了什么& &;除了现在,历史记录没有隐藏在主表中,也不会降低索引的速度。和…您可以获得TRUE审计,而不仅仅是日志发送。
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存储过程中的触发器,使审计"更干净"
- 它变得"更干净"的原因是你得到一个单一的DELETE审计记录而不是UPDATE &删除审计记录
- 要做到这一点,只需在DELETE语句之前关闭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