通过asp.net将参数传递给SQL触发器

本文关键字:SQL 触发器 参数传递 asp net 通过 | 更新日期: 2023-09-27 18:24:43

我的数据库中有一个Employee表。值通过asp.net页面插入到该表中。我想对Employee insert进行触发,只有当它是由具有"id=1110"的用户进行时,才允许插入,所有其他用户的插入都必须被拒绝。我不知道如何将userid作为参数传递给触发器。有人能帮我吗???

通过asp.net将参数传递给SQL触发器

触发器不能传递参数-必须在数据库操作中操作。因此,除非Employee表的CreateBy或LastUpdateBy引用了进行更改的用户的id,否则您需要将INSERT封装到一个存储过程中,该存储过程将在执行INSERT之前执行该检查。

如果您的Employee表偶然有一个CreateBy,其中包含执行更改的用户的id,那么下面这样的触发器应该有效:

CREATE TRIGGER tg_Employees_RegisterAdminOnly ON dbo.Employees
AFTER INSERT AS
BEGIN
    IF EXISTS (SELECT * FROM INSERTED WHERE CreateBy <> 1110) BEGIN
        RAISERROR('Unauthorized registration', 16, 1)
        ROLLBACK
        RETURN
    END
END
GO

创建触发器后,您可以在c#代码中调用以下存储过程:

--table|start
CREATE TABLE dbo.z_Employee (ID INT IDENTITY(1, 1), Name VARCHAR(100), UserModify SMALLINT)
--table|end

--stored procedure for inserting new employee|start
CREATE PROC dbo.z_AddEmployee(@Name VARCHAR(100), @UserModify SMALLINT)
AS
--for debugging|start
--DECLARE @Name VARCHAR(100)
--  , @UserModify SMALLINT = 1112
--for debugging|end
INSERT dbo.z_Employee (Name, UserModify)
VALUES (@Name, @UserModify)
--for debugging|start
--SELECT e.*
--FROM dbo.z_Employee e WITH(NOLOCK)
--for debugging|end
--stored procedure for inserting new employee|end

--trigger for disallowing inserts|start
CREATE TRIGGER dbo.z_DoNotAllowOtherUser
ON dbo.z_Employee
FOR INSERT
AS
IF EXISTS
    (SELECT TOP 1 i.ID
    FROM INSERTED i
    WHERE i.UserModify <> 1110)
BEGIN
    DELETE e
    FROM dbo.z_Employee e WITH(NOLOCK)
        JOIN INSERTED i ON i.ID = e.ID
END
--trigger for disallowing inserts|end