【问题标题】:Trigger not firing for instead of insert sql server触发器不触发而不是插入 sql server
【发布时间】:2022-11-21 03:41:31
【问题描述】:

我正在尝试创建一个触发器来将值从 varchar 转换为 varbinary。 触发器创建成功。但是,它不会触发插入查询。

触发代码

USE VacationManager;
GO

CREATE TRIGGER HashPassword
ON Users
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO Users(Username,[Password],FirstName,LastName,RoleID)
SELECT
i.Username,
 CONVERT(varbinary(max),EncryptByPassPhrase('iskam_6_za_bazata_moje_i_za_springa',i.[Password]),2) ,
i.FirstName,
i.LastName,
i.RoleID
FROM inserted AS i
END

用户表

USE [VacationManager]
GO

/****** Object:  Table [dbo].[Users]    Script Date: 11/20/2022 8:58:16 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Users](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Username] [varchar](255) NOT NULL,
    [Password] [varbinary](max) NOT NULL,
    [FirstName] [nvarchar](255) NOT NULL,
    [LastName] [nvarchar](255) NOT NULL,
    [RoleID] [int] NOT NULL,
PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

ALTER TABLE [dbo].[Users]  WITH CHECK ADD  CONSTRAINT [FK_Users.RoleID] FOREIGN KEY([RoleID])
REFERENCES [dbo].[Roles] ([Id])
GO

ALTER TABLE [dbo].[Users] CHECK CONSTRAINT [FK_Users.RoleID]
GO

我尝试执行此查询:

INSERT INTO Users(Username,[Password],FirstName,LastName,RoleID)
VALUES('martini','parola','martin','atanasov',4)

但结果是:

Implicit conversion from data type varchar to varbinary(max) is not allowed. Use the CONVERT function to run this query.

【问题讨论】:

  • 我会问你需要能够解密这些密码?您的触发器说它正在“散列”它们,但事实并非如此;散列是一种方式。你为什么不真正对它们进行散列和加盐(最好在应用程序中)?
  • @Larnu 是的,我需要能够解密它们。我不知道散列和加密之间的区别,所以我将它命名为 hashpassword。
  • 另外,您真的不应该使用可逆加密来存储密码——您应该始终对密码进行散列处理,并使用存储的散列值验证散列参数。
  • 散列是“一种方式”;一旦一个值被散列,你不应该能够“取消散列”它来计算出原来的值是什么。加密设计为两种方式;当你加密某些东西时,你可以使用用于加密它的密钥来解密它,并获得原始值。如果您正在存储用户的登录凭据,以便他们可以对应用程序进行身份验证,则您不需要能够解密它。我个人怀疑您是否确实需要解密这些值;如果你是那么用户至少应该知道任何管理员可以查看他们的密码

标签: sql sql-server triggers


【解决方案1】:

您不能将 varchar 插入到 varbinary max 列中。所以这

INSERT INTO Users(Username,[Password],FirstName,LastName,RoleID)
VALUES('martini','parola','martin','atanasov',4)

应该

INSERT INTO Users(Username,[Password],FirstName,LastName,RoleID)
VALUES('martini', cast(N'parola' as varbinary(max)),'martin','atanasov',4)

或者您在用户上创建一个执行 varbinary>nvarchar 转换的视图,并将您的 instead of 触发器放在上面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多