SQL Server从其他表

时间:2018-06-05 12:35:38

标签: sql sql-server

在我的数据库中,我有表格:

  • 系统权限(PrivilegesTable)
  • 管理员(AdminsTable)
  • 管理员权限(AdminsPrivilegesTable)。

我想在插入新的管理员数据后将数据插入AdminsPrivilegesTable我将使用触发器,但我需要查询以获取管理员ID并从PrivilegesTable获取所有权限iD并将其插入AdminsPrivilegesTable。我使用了这个查询,但没有用。

INSERT INTO [AdminsPrivilegesTable]
           ([ID]
           ,[AdminID]
           ,[PrevlgID]
           ,[Status])
     VALUES
           ((SELECT ISNULL(MAX(ID)+1,1) FROM AdminsPrivilegesTable)
           ,(SELECT ID FROM Inserted)
           ,(SELECT ID FROM PrivilegesTable)
           ,0)

2 个答案:

答案 0 :(得分:1)

此演示的

示例数据

CREATE TABLE SYSTEM_PRIVILEGES ([ID] INT IDENTITY NOT NULL,
                                [NAME] NVARCHAR(50),
                                [ISDEFAULT] INT)
INSERT INTO SYSTEM_PRIVILEGES ([NAME], ISDEFAULT) VALUES
('READ', 1),
('EXECUTE', 0),
('WRITE', 0)

CREATE TABLE ADMINS ([ID] INT IDENTITY NOT NULL, [NAME] NVARCHAR(50))
INSERT INTO ADMINS ([NAME]) VALUES
('systemadmin'),
('backupadmin'),
('ITadmin')

CREATE TABLE AdminsPrivilegesTable ([ID] INT IDENTITY,
                                    [AdminID] INT,
                                    [PrevlgID] INT,
                                    [Status] INT)

现在,您希望在创建新管理员时自动执行AdminsPrivilegesTable中的插入。你站在2个解决方案前面,imho。

  1. 询问插入Admin行的应用程序(或存储过程或其执行的任何操作),在另一个表中创建一个新插入,可能类似于:
  2. 插入声明

    INSERT INTO AdminsPrivilegesTable ([AdminID], [PrevlgID], [Status])
    SELECT ADMINS.[ID],
           PREV.[ID],
           1
    FROM ADMINS,
    SYSTEM_PRIVILEGES PREV
    WHERE NOT EXISTS (SELECT 1
                      FROM AdminsPrivilegesTable T
                      WHERE T.AdminID = ADMINS.ID
                      AND T.PrevlgID = PREV.ID)
    
    1. 使用与上述相同的查询进行触发
    2. 就像我在评论中所说,我会建议第一个

      SQL Fiddle here

答案 1 :(得分:0)

您需要在触发器中为多行写入查询,因为Inserted是一个可以容纳多行的表。

在您的示例代码中,不清楚如何获取某些值,因此我将在此处给出一个伪代码示例

INSERT INTO AdminsPrivilegesTable (
  ID, AdminID, PrevlgID, Status)

SELECT ((SELECT ISNULL(MAX(apt.ID)+1,1) FROM AdminsPrivilegesTable apt) -- BAD IDEA
       ,i.ID
       ,(SELECT pt.ID FROM PrivilegesTable pt) -- not clear in your example how to do this
       ,0
FROM   inserted i

我需要有关您的表架构的更多信息以及一些示例数据以获得更好的答案