0

我有以下表格:

create table ApartmentInfo(
     ApartmentId int primary key identity,
     ApName nvarchar(50))

create table [User](
     UserId int primary key identity,
     FirstName nvarchar(50),
     LastName    nvarchar(50),
     Username nvarchar(50),
     [Password] nvarchar(50),
     [Description] nvarchar(200))

create table ApUser(
     ApartmentId int foreign key references ApartmentInfo(ApartmentId),
     UserId int foreign key references [User](UserId),
     primary key(ApartmentId,UserId))

使用总结是:假设我的桌子上有 10 个公寓,Apartmentinfo桌子上有 3 个用户[User]

现在我想编写一个存储过程,这样:

  1. everyUserId都有所有 10 ApartmentId,并且每当在 table 中创建一个新公寓时,ApartmentInfo它也会ApUser再次添加到 table 中,并且所有 3 userId
  2. 如果在User表中创建了一个新用户,那么它也会在表中包含所有 10ApartmentId与其相关的用户ApUser

在此先感谢,我是 SQL Server 的新手,我不知道它是如何完成的,但是,如果可能的话,请告诉我,我将不胜感激,谢谢。

4

2 回答 2

0

为了解决您关于如何将公寓与用户关联的问题,如果您想稍后...

如果您限制用户可以查看哪些公寓,我不会将它们单独关联到每个用户。但是,如果他们在您的应用程序中手动在公寓上添加“手表”,那么可以这样做。如果您只想向他们展示一组特定的公寓,请尽可能以合乎逻辑的方式对它们进行分组。所以也许有一个 ApartmentGroup 查找表:

ApartmentGroup(ApartmentGroupId (Int), ApartmentGroupName varchar(50))

并为每个公寓分配一个 ApartmentGroupId。然后你可以有一个 ApUser 和 ApartmentGroup 的连接表。这样一来,您就不会将每个公寓与每个用户关联起来。

但是,如果您仍想将公寓添加到每个用户,那么在您的 InsertApartment 存储过程中,只需将其插入 ApUser 表中即可。

于 2013-06-26T18:24:18.577 回答
0

如果您没有死心塌地使用存储过程,那么这个用例似乎非常适合服务器端触发器:

IF  EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[trigger_insert_apartment]'))
DROP TRIGGER [dbo].[trigger_insert_apartment]
GO
CREATE TRIGGER trigger_insert_apartment
ON ApartmentInfo FOR INSERT 
AS INSERT ApUser(ApartmentId, UserId ) SELECT i.ApartmentId, u.UserId FROM [User] AS u, inserted AS i
GO

IF  EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[trigger_insert_user]'))
DROP TRIGGER [dbo].[trigger_insert_user]
GO
CREATE TRIGGER trigger_insert_user
ON [User] FOR INSERT 
AS INSERT ApUser(ApartmentId,UserId ) SELECT a.ApartmentId, i.UserId FROM ApartmentInfo AS a, inserted AS i
GO

当您添加新用户或公寓时,这两个触发器会将所有公寓或用户插入 apinfo 表中,如果我理解您的问题,这就是您想要的?

于 2013-06-23T09:52:27.720 回答